簡體   English   中英

如何延遲RxJava2訂閱?

[英]How do I delay RxJava2 subscription?

我有以下代碼,該代碼在響應中返回了大量數據,以至於當我向下滾動太快時(由於並非所有數據都已初始化),在將其加載到android Activity中時會收到NullPointerException,問題,如果我等待一秒鍾,然后滾動。

我想要一種延遲subscribe部分的方法,以便在我調用setAdapter時, Response<GetFeedTopicsResponseBody>完全填充有數據(沒有初始化)。 我嘗試檢查response.isSuccessful但由於響應本身沒有問題,因此無法正常工作,只是數據需要時間才能從JSON反序列化為Java對象。 我也嘗試了subscribe onComplete ,但這也不起作用。

因此,我希望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並且正確加載了用戶的縮略圖URL。

問題:如何延遲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執行與適配器相關的操作。 :)

希望這能回答您提出的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM