可观察的android理解

时间:2016-04-11 00:03:09

标签: 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());
                    }
                }
            });

感谢您的帮助和建议。

1 个答案:

答案 0 :(得分:1)

也许你的代码很重,并且它的加载同步。尝试在新线程中加载你的代码,也许你可以使用observeOn()(我不确切地知道rxjava是如何工作的,但我的猜测是这个函数定义了事件发生的线程)。