我有以下代码,它在响应中返回了大量数据,当我向下滚动太快时(因为并非所有数据都已初始化),当我在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
,并且正确加载了用户的缩略图网址。
答案 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()));
}
});
输出:
你看,在Next上被调用两次,延迟10秒。
在这里,您可以在onComplete
中执行与适配器相关的操作。 :)
希望这能回答你提出的问题。