rxJava Observer.onNext未被第二次调用

时间:2016-08-16 20:50:42

标签: android-fragments rx-java rx-android

我正在使用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);
}

ContactsLab是一个返回Observable of Contact对象的单例。 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添加了更多项),则调用onResumeupdateUI运行,onContactsReceived也运行但立即返回而不调用{{1} }或onNext

我认为这与rxJava处理可观察对象的方式有关,但不知道如何解决它(阅读onComplete但不太了解)。有人可以帮忙吗?

修改

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); } 映射到我的Contact类(这是一个POJO)。我添加了Cursor来获取一个observable,后来使用rx.Observable.from进行了整理并更新到适配器中。 我使用这种方法避免在获得每个项目后调用toList(并在获得所有项目后仅调用一次)。

什么是最小化notifyDataSetChanged次呼叫的正确方法,并且每次调用notifyDataSetChanged时刷新一次?

1 个答案:

答案 0 :(得分:2)

您的可观察# measure execution time import timeit import numpy as np def f1(num_iterations): x = np.dtype((np.int32, (2, 1))) for i in range(num_iterations): x = np.append(x, (i, i)) def f2(num_iterations): x = np.array([(0, 0)]) for i in range(num_iterations): x = np.vstack((x, (i, i))) def f3(num_iterations): x = [] for i in range(num_iterations): x.append((i, i)) x = np.array(x) N = 50000 print timeit.timeit('f1(N)', setup='from __main__ import f1, N', number=1) print timeit.timeit('f2(N)', setup='from __main__ import f2, N', number=1) print timeit.timeit('f3(N)', setup='from __main__ import f3, N', number=1) 已终止。contactsLab.getContactList().toList()会收集来自可观察源的所有排放到列表,并在源Observable终止后发出整个列表(请参阅documentation)。你不会再观察它的排放量了。