如何延迟RxJava2订阅?

时间:2018-02-21 22:53:24

标签: java android rx-java rx-java2

我有以下代码,它在响应中返回了大量数据,当我向下滚动太快时(因为并非所有数据都已初始化),当我在android活动中加载它时,我得到一个NullPointerException ),如果我等一下然后滚动就没问题。

我想要一种延迟subscribe部分的方法,以便在我调用Response<GetFeedTopicsResponseBody>setAdapter完全填充数据(没有未初始化)。我尝试检查response.isSuccessful,但这不起作用,因为响应本身没有问题,只是数据需要时间从JSON反序列化为Java对象。我还在onComplete中尝试subscribe,但这也不起作用。

所以我希望RxJava2中的一种方法有一个布尔值开关,一旦完成就会通知以下订阅,它会订阅。

        mGetFeedTopicsDisposable = ApiClient.getInstance()
            .doGetFeedTopicsQuery(request)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
            .subscribe((Response<GetFeedTopicsResponseBody> response) -> {
                if (response.body() != null) {
                    List<Topic> topics = response.body().getTopics();
                    if (topics != null) {
                        mBinding.fragmentTopicListRecyclerTopics.setAdapter(TopicListAdapter.getInstance(topics));
                        if (response.body().isPaginated()) {
                            mRequestBuilder.setCursor(response.body().getCursor());
                        }
                    }
                }
            }, (Throwable ex) -> {
                Log.e(TAG, ex.getMessage());
            });

我特意得到的错误信息是:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.models.User.getThumbnailImageUrl()' on a null object reference

将此User对象设置为Topic对象的字段,该对象将添加到使用getTopics()检索的主题列表中。如果我不滚动,我不会得到这个NullPointerException,并且正确加载了用户的缩略图网址。

1 个答案:

答案 0 :(得分:2)

问题:如何延迟RxJava2订阅?

示例:

我已添加repeat(...)以便更好地理解。

io.reactivex.Observable
                    .just(new Object())
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .delay(10, TimeUnit.SECONDS)
                    .repeat(2)
                    .doOnSubscribe(disposable -> Log.d("Delay Example ","Observer subscribed at : "+  DateFormat.getDateTimeInstance().format(new Date()) + " and execute after 10 seconds"))
                    .subscribe(new DefaultObserver<Object>() {
                        @Override
                        public void onNext(Object o) {
                            Log.d("Delay Example ","on Next : "+  DateFormat.getDateTimeInstance().format(new Date()));
                        }
                        @Override
                        public void onError(Throwable e) {}
                        @Override
                        public void onComplete() {
                            Log.d("Delay Example ","on Complete : "+ DateFormat.getDateTimeInstance().format(new Date()));
                        }
                    });

输出:

log

你看,在Next上被调用两次,延迟10秒。

在这里,您可以在onComplete中执行与适配器相关的操作。 :)

希望这能回答你提出的问题。