rxJavaを使用してデータベースからデータを取得し、それをrecyclerviewに表示します。関連するコードはrxJava Observer.onNextが2回目に呼び出されない
function updateUI(){
ContactsLab contactsLab = ContactsLab.get(getActivity());
Subscription sub = contactsLab.getContactList().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.toList()
.subscribe(onContactsReceived());
mCompositeSubscription.add(sub);
}
ContactsLab
下に示されている連絡先オブジェクトの観測を返すシングルトンです。 onContactsReceived
機能は
private Observer<List<Contact>> onContactsReceived(){
return new Observer<List<Contact>>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(List<Contact> contacts) {
if(mContactsAdapter == null) {
mContactsAdapter = new ContactsAdapter(contacts);
mRecyclerView.setAdapter(mContactsAdapter);
} else{
mContactsAdapter.setContactList(contacts);
mContactsAdapter.notifyDataSetChanged();
}
}
};
}
updateUI
機能が私のフラグメントonResume
に呼ばれているの下に表示されますが、ビューは、初回のみ更新されます。他のフラグメント(dbに項目を追加したもの)からこのフラグメントに戻った場合、onResume
が呼び出され、updateUI
が実行され、onContactsReceived
も実行されますが、onNext
またはonComplete
を呼び出さずにすぐに戻ります。
これは、rxJavaがobservablesを処理する方法と関係がありますが、それを修正する方法はありません(defer
について読んでいますが、あまり理解できませんでした)。誰か助けてもらえますか?
編集:このような
getContactList
機能ルック:
public rx.Observable<Contact> getContactList() {
List<Contact> contacts = new ArrayList<>();
ContactCursorWrapper cursorWrapper = queryContacts(null, null);
try{
cursorWrapper.moveToFirst();
while (!cursorWrapper.isAfterLast()){
contacts.add(cursorWrapper.getContact());
cursorWrapper.moveToNext();
}
} finally {
cursorWrapper.close();
}
return rx.Observable.from(contacts);
}
は、基本的には、データベースを照会し、(POJOである)私の連絡先クラスに返さCursor
をマッピングします。 rx.Observable.from
を追加してオブザーバブルを取得し、後でtoList
を使用して照合し、アダプタに更新しました。 私はこの方法を使用して、各項目を取得した後にnotifyDataSetChanged
に電話する必要がなくなりました。
notifyDataSetChanged
コールの数を最小限に抑え、また、onResume
が呼び出されるたびにリフレッシュする正しい方法はありますか?
2回目に 'onError()'を呼び出さないのですか? – JohnWowUs
いいえ、オブザーバーで何も呼び出されません。デバッガは、returnステートメントで 'onContactsReceived'関数に到達するが、' Observer'のメソッドはどれも呼び出されないことを示しています。私は 'observable'を自分で作成していません。' from'関数を直接使って、これと何か関係がありますか? – sudshekhar
Observableを作成していない場合は、 'getContactList()'を呼び出すと毎回新しい観測値が得られない可能性があります。あなたはただ終了していて、連絡先の最初のリストの後に何も放出しない、古い観測を取得しています。あなたの説明から、それは確かに起こっているように聞こえる。 – JohnWowUs