2016-11-25 8 views
1

次のコードを使用してください。私は期待しています:RxJavaを使用したRealmRecylerAdapter

1.サーバー側からすべてのデータを取得します。

2.すべてのデータの更新RecycleView

3.レルムにレルムアダプタ付き。

初めてデータは常に空です。データはまだ準備ができていませんが、依然としてサブスクリプションが呼び出されているのでしょうか?データの準備ができたらビューを更新する方法はありますか?

ApiCall().doOnNext(response -> { 
    Realm realm = Realm.getDefaultInstance(); 
    try { 
     realm.beginTransaction(); 
     realm.insertOrUpdate(response); 
     realm.commitTransaction(); 
    } finally { 
     realm.close(); 
} 
}).subscribeOn(Schedulers.io()) 
    .unsubscribeOn(Schedulers.computation()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new exObserver<List<T>>() { 
     @Override 
     public void onResponse(List<T> response) { 
      updateView() 
     } 
     @Override 
     public void onFailure(exException exception) { 
      adapter.notifyChanged(); 
     } 
}); 

答えて

1

EpicPandaForceに言及したように、変更があったときにRealmRecyclerViewAdapterに通知する必要はありません。

私の回答は、RxJavaの使用を特に対象としています。

doOnNext()は、副作用の方法です。 これはストリームに影響を与えずにストリームと平行して呼び出されることを意味します。あなたのAPI呼び出しが戻る、doOnNext()Action1subscribe()Observerが両方同時に起動されます

これは、Realmトランザクションが終了する前にupdateView()が呼び出されたことを意味します。

DBに挿入した後にビューを更新する場合は、ストリーム内でトランザクションを実行する必要があります。

この目的でflatMap()を使用できます。

+0

完璧な答え。ありがとう。 –

0

あなたのapiCall()メソッドとは何ですか? Retrofitを使用していない場合は、Observable.defer(() - > apicall())を使用してみてください。これにより、実際の値が到着するまでコード評価が遅れることになります。

+0

私はRetrofitを使用しています。 –

1

RealmRecyclerViewAdapterは、提供されたデータセットがRealmChangeListenerであることをすでに確認しており、基礎となるレルムで変更が発生した場合はadapter.notifyDataSetChanged()を呼び出します。

なぜ手動でadapter.notifyDataSetChanged()を呼び出そうとしていますか? RealmRecyclerViewAdapterは具体的に作成されているため、行う必要はありません。

関連する問題