RxJava/RxKotlin жалуется на доступ к представлениям

У меня есть следующий вызов для получения некоторых данных с сервера и обновления пользовательского интерфейса в соответствии с ответом.

    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 ответа

Решение

Ты пытался сделать что-то вроде этого...

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

обрати внимание на observeOn а также subscribeOn

Похоже, вы используете observeOn а также subscribeOn не правильно... посмотрите, как RXJava Scheduler/Threading работает для разных операторов?

Я сделал с помощью приведенного ниже кода, используя 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**/);

Попробуйте использовать приведенный выше код и дайте мне знать.

Другие вопросы по тегам