RxJava / RxKotlin жалуется на доступ к представлениям - PullRequest
0 голосов
/ 17 декабря 2018

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

    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 голосов
/ 09 января 2019

Вы пытались сделать что-то подобное ...

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 работает для разных операторов?

0 голосов
/ 17 декабря 2018

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

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

...