[英]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.