android - Observable android 理解

标签 android android-recyclerview rx-java reactive-programming observable

我正在尝试了解观察者模式在 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/

相关文章:

java - RecyclerView OnClick 带到另一个 Fragment

android - 有没有办法检查 "Install from unknown source"是否在 Android 上启用?

android - Android同时在不同的耳机上播放两首不同的歌曲

android - 用于创建 Android 程序的替代语言或工具链

android - 使用 Retrofit observable 处理网络错误

java - 为什么在这种情况下我们需要 Publish 和 RefCount Rx 运算符?

java - RxJava : Publish subject doOnSubscribe never gets called

android - 如何使用后退按钮防止一个 Activity 的多个实例?

android - 如何为 Recycler View 的选定项目设置颜色?

java - Recyclerview android 不工作