我正在使用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添加了更多项),则调用onResume
,updateUI
运行,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
时刷新一次?
答案 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)。你不会再观察它的排放量了。