我正在尝试了解观察者模式在 Android 中的工作原理。
我创建了这个方法来加载示例对象列表,将每个项目推送到订阅者并将其加载到 recyclerview 中。
我不明白为什么如果我加载 10 个项目一切正常,但如果我加载 100/1000 或通常更多的项目,recyclerView 是空的并且不会触发 onNext、onComplete。
private Observable<AppInfo> getAppList() {
return Observable.create(new Observable.OnSubscribe<AppInfo>() {
@Override
public void call(Subscriber<? super AppInfo> subscriber) {
for (int i = 0; i<10; i++){
AppInfo appInfo = new AppInfo(
"Test item "+i,
ContextCompat.getDrawable(getApplicationContext(), R.mipmap.ic_launcher),
i
);
subscriber.onNext(appInfo);
}
if (!subscriber.isUnsubscribed()) {
subscriber.onCompleted();
}
}
});
}
这就是我使用 Observable 的方式:
Observable<AppInfo> appInfoObserver = getAppList();
appInfoObserver
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<AppInfo>() {
@Override
public void onCompleted() {
Toast.makeText(getApplicationContext(), "App List Load Completed!", Toast.LENGTH_LONG).show();
}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(AppInfo appInfo) {
if(mAppInfoList != null){
mAppInfoList.add(appInfo);
adapter.notifyItemInserted(appInfo.getAppPosition());
}
}
});
感谢您的帮助和建议。
最佳答案
您没有记录错误,因此如果出现任何问题您都不会知道(在这种情况下,您可能通过发送比请求更多的次数来强制来自 MissingBackpressureException
运算符的 observeOn
。明确地说,在订阅者中:
public void onError(Throwable e) {
// log or display error here!!
}
不要使用 Observable.create
如果你能提供帮助的话,完全可以,因为你需要尊重背压或将其与 .onBackpressureBuffer
结合使用.
异常(exception)情况是 Observable.create(new SyncOnSubscribe<T>(...))
是创建 Observable
的好方法如果您可以将您的源想象成一个迭代器/枚举。
避免使用Observable.create
在您的示例中,您可以这样做:
Observable
.range(0, 10)
.map(i -> new AppInfo(...))
或没有 lambda:
Observable
.range(0, 10)
.map(new Func1<Integer, AppInfo>() {
@Override
public AppInfo call(Integer n) {
return new AppInfo(...);
}
});
关于android - Observable android 理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36537876/