Android fragments rxJava Observer.onNext未第二次调用
我正在使用rxJava从数据库中获取数据,并将其显示在recyclerview中。相关代码如下所示Android fragments rxJava Observer.onNext未第二次调用,android-fragments,rx-java,rx-android,Android Fragments,Rx Java,Rx Android,我正在使用rxJava从数据库中获取数据,并将其显示在recyclerview中。相关代码如下所示 function updateUI(){ ContactsLab contactsLab = ContactsLab.get(getActivity()); Subscription sub = contactsLab.getContactList().subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers
function updateUI(){
ContactsLab contactsLab = ContactsLab.get(getActivity());
Subscription sub = contactsLab.getContactList().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.toList()
.subscribe(onContactsReceived());
mCompositeSubscription.add(sub);
}
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();
}
}
};
}
ContactsLab
是一个单例,返回可观察的联系人对象。
onContactsReceived
功能如下所示
function updateUI(){
ContactsLab contactsLab = ContactsLab.get(getActivity());
Subscription sub = contactsLab.getContactList().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.toList()
.subscribe(onContactsReceived());
mCompositeSubscription.add(sub);
}
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();
}
}
};
}
基本上,它查询数据库并将返回的游标映射到my Contact类(这是一个POJO)。我添加了rx.Observable.from
,以获得一个可观测数据,该数据随后使用toList
进行整理并更新到适配器中。
我使用这种方法避免了在获取每个项目后调用notifyDataSetChanged
(并且在获取所有项目后只调用一次)
什么是减少notifyDataSetChanged
调用次数的正确方法,以及每次调用onResume
时刷新的正确方法?您可观察的contactsLab.getContactList().toList()
已终止。toList()
将可观测源的所有排放收集到列表中,并在可观测源终止时发出整个列表(请参阅)。你不会再看到它的排放了。Ohh谢谢你指出这一点!我使用toList函数来更新适配器
(如图所示)。你能告诉我一种更好的方法,一次获取所有可观测数据并更新适配器吗?将它们逐个存储在onNext
中并在onComplete
中更新适配器是正确的方法吗?您的contactsLab.getContactList()
看起来像什么?我用相关信息更新了问题。基本上是在寻找一种方法来更新游标中的数据,而不必每次调用适配器上的notifyDataSetChanged
。您确定没有第二次调用onError()
吗?不,观察者中不会调用任何内容。调试器显示我们在return语句中到达了onContactsReceived
函数,但没有调用Observer
中的任何方法。我自己还没有创建可观察的。。直接使用from
函数,这与此有关吗?如果您没有创建可观察对象,那么很可能每次调用getContactList()
时都没有获得新的可观察对象。你只是得到一个旧的可观察对象,它已经终止,并且在第一个联系人列表之后永远不会发出任何东西。根据你的描述,这听起来确实是正在发生的事情。