Android fragments rxJava Observer.onNext未第二次调用

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

我正在使用rxJava从数据库中获取数据,并将其显示在recyclerview中。相关代码如下所示

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()
时都没有获得新的可观察对象。你只是得到一个旧的可观察对象,它已经终止,并且在第一个联系人列表之后永远不会发出任何东西。根据你的描述,这听起来确实是正在发生的事情。