簡體   English   中英

使用repeatWhen RxJava2重復Retrofit2請求

[英]Repeat Retrofit2 request using repeatWhen RxJava2

我正在使用rxjava2 我的問題是服務器有時什么都不發送(響應正文為null,等等,列表大小= 0),因此在這種情況下,我想在5秒鍾后重復請求。 我有一個Retrofit2請求:

  @GET("/ics/api/{bidId}/calltracking/reports/widgets")
    Single<List<CallTrackingWidget>> getWidgets(@Path("bidId") int bidId);

像這樣使用它:

RetrofitFactory.getRetrofitService().getWidgets(mDataManager.getBidId())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(widgets -> getView().showLoading())
                .doOnSuccess(widgets -> getView().hideLoading())
                .repeatWhen(widgets -> widgets.flatMap(size -> {
                    if ((int) size == 0) {
                        return Flowable.just("asd").delay(5, TimeUnit.SECONDS);
                    } else {
                        return widgets;
                    }
                }))
                .subscribe(widgets -> {
                    mDataManager.getProduct().getCallTrackingData().setWidgets(widgets);
                    getView().initWidgets(mDataManager.getProduct().getCallTrackingData().getWidgetNames());
                }, throwable -> {
                    handleError(throwable, R.string.error_internet);
                })

但是我的代碼有一個例外:

android.view.ViewRootImpl$CalledFromWrongThreadException: 
Only the original thread that created a view hierarchy can touch its views.

列表大小為0時,請幫助我在5秒后重復請求。

我認為您的問題出在以下兩行:

.doOnSubscribe(widgets -> getView().showLoading())
.doOnSuccess(widgets -> getView().hideLoading())

這兩個動作將從主線程執行。 並且作為例外暗示,您只能從主線程觸摸Android視圖。

嘗試將此視圖操作移動到其他位置。 像這樣:

getView().showLoading(); // Show loading view
RetrofitFactory.getRetrofitService().getWidgets(mDataManager.getBidId())
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .repeatWhen(widgets - > widgets.flatMap(size - > {
        if ((int) size == 0) {
            return Flowable.just("asd").delay(5, TimeUnit.SECONDS);
        } else {
            return widgets;
        }
    }))
    .subscribe(widgets - > {
        getView().hideLoading(); // Hide loading view
        mDataManager.getProduct().getCallTrackingData().setWidgets(widgets);
        getView().initWidgets(mDataManager.getProduct().getCallTrackingData().getWidgetNames());
    }, throwable - > {
        getView().hideLoading(); // Hide loading view
        handleError(throwable, R.string.error_internet);
    })

因為您不處理主線程上的視圖,所以可以這樣編寫:

RetrofitFactory.getRetrofitService().getWidgets(mDataManager.getBidId())
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnSubscribe(widgets -> getView().showLoading())
    .subscribeOn(AndroidSchedulers.mainThread())
    .repeatWhen(widgets - > widgets.flatMap(size - > {
        if ((int) size == 0) {
            return Flowable.just("asd").delay(5, TimeUnit.SECONDS);
        } else {
            return widgets;
        }
    }))
    .subscribe(widgets - > {
        getView().hideLoading(); // Hide loading view
        mDataManager.getProduct().getCallTrackingData().setWidgets(widgets);
        getView().initWidgets(mDataManager.getProduct().getCallTrackingData().getWidgetNames());
    }, throwable - > {
        getView().hideLoading(); // Hide loading view
        handleError(throwable, R.string.error_internet);
    })

暫無
暫無

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

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