RxJava / RxKotlin抱怨访问视图

时间:2018-12-17 09:22:52

标签: android rx-java reactive-programming rx-kotlin

我有以下电话从服务器检索一些数据并根据响应更新UI。

    poiAPIService.getPoiDetails(poiId!!)
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe { showProgressBar(true) }
            .doFinally { showProgressBar(false) }
            .subscribeOn(Schedulers.io()).subscribe(
                    { poiDetails ->
                        bindPoiDetails(poiDetails)
                    },
                    {
                        (getActivity() as MainOverviewActivity).fragmentControl.hidePoiDetailsFragment()
                    })

}

它抱怨showProgressBar,视图只能在创建视图的线程上访问。 如果我这样更改通话,一切似乎都会恢复正常。

showProgressBar(true)
poiAPIService.getPoiDetails(poiId!!)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.io()).subscribe(
                { poiDetails ->
                    showProgressBar(false)
                    bindPoiDetails(poiDetails)
                },
                {
                    showProgressBar(false)
                    (getActivity() as MainOverviewActivity).fragmentControl.hidePoiDetailsFragment()
                })

}

2 个答案:

答案 0 :(得分:3)

我已经使用RxJava 2.x使用以下代码完成了

 poiAPIService.getPoiDetails(poiId!!)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe(new Consumer < Disposable >() {
                @Override
                public void accept(Disposable disposable) throws Exception {
                    showProgressBar(true);
                }
            })
            .doFinally(new Action () {
                @Override
                public void run() throws Exception {
                    showProgressBar(false);
                }
            })
            .subscribe(/**your subscription here**/);

尝试使用上面的代码,让我知道。

答案 1 :(得分:1)

您是否尝试过执行以下操作...

poiAPIService.getPoiDetails(poiId!!)
        .subscribeOn(AndroidSchedulers.mainThread())
        .observeOn(Schedulers.io())
        .doOnSubscribe { showProgressBar(true) }
        .doFinally { showProgressBar(false) }
        .subscribe(
                { poiDetails ->
                    bindPoiDetails(poiDetails)
                },
                {
                    (getActivity() as MainOverviewActivity).fragmentControl.hidePoiDetailsFragment()
                })

注意observeOnsubscribeOn

好像您没有正确使用observeOnsubscribeOn ... 看看How RXJava Scheduler/Threading works for different operator?