Доступ к макету предметов из RxAndroid? - PullRequest
0 голосов
/ 12 июня 2018

Я использую код ниже:

    mCompositeDisposable.add(myObservable(IdLang, shortTermCoursesModels)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableObserver<String>() {
                @Override
                public void onComplete() {
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(String string) {
                    listenerCoursesListItemService.adapterHideProgress();
                }
            }));

И:

private Observable<String> myObservable(String IdLang, List<GetShortTermCoursesModel> shortTermCoursesModels) {
    return Observable.defer(new Callable<ObservableSource<? extends String>>() {
        @Override
        public ObservableSource<? extends String> call() throws Exception {
            listenerCoursesListItemService.adapterShowProgress();
            for (int i = 0; i < 900000; i++) {
                Log.i("WWWWWWWW", "A " + i);
            }
            return Observable.just("ok");
        }
    });

Но получите мне ошибку ниже:

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

Как я могу получить доступUI с RxAndroid.

Моя ошибка здесь:

listenerCoursesListItemService.adapterShowProgress();
listenerCoursesListItemService.adapterHideProgress();

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Причина в том, что вы пытаетесь показать прогресс ->

listenerCoursesListItemService.adapterShowProgress(); 

внутри метода call (), который на самом деле выполняется в другом потоке (Schedulers.io ()), а не в потоке пользовательского интерфейса (AndroidSchedulers.mainThread ()).

Вместо этого вы можете показать прогресс внутри метода doOnSubscribe () и отклонить его внутри onComplete ().Оба метода будут вызваны в потоке пользовательского интерфейса.Обновленный код ниже для справки:

mCompositeDisposable.add(myObservable(IdLang, shortTermCoursesModels)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnSubscribe(new Consumer<Disposable>() {
        @Override
        public void accept(@NonNull Disposable disposable) throws Exception {
            listenerCoursesListItemService.adapterShowProgress();
        }
    })
    .doFinally(new Action() {
        @Override
        public void run() throws Exception {
           listenerCoursesListItemService.adapterHideProgress();
        }
    })
    .subscribeWith(new DisposableObserver<String>() {
        @Override
        public void onComplete() {
        }

        @Override
        public void onError(Throwable e) {
        }

        @Override
        public void onNext(String string) {
        }
    }));

И:

private Observable<String> myObservable(String IdLang, List<GetShortTermCoursesModel> shortTermCoursesModels) {
    return Observable.defer(new Callable<ObservableSource<? extends String>>() {
        @Override
        public ObservableSource<? extends String> call() throws Exception {
            for (int i = 0; i < 900000000; i++) {
                Log.i("WWWWWWWW", "A " + i);
            }
            return Observable.just("ok");
        }
    });
}

Внутри onNext () вы получите строку, возвращаемую методом call ().

0 голосов
/ 13 июня 2018

Вы должны подписаться на основную ветку:

mCompositeDisposable.add(myObservable(IdLang, shortTermCoursesModels)
        .subscribeOn(AndroidSchedulers.mainThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeWith(new DisposableObserver<String>() {
            @Override
            public void onComplete() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(String string) {
                listenerCoursesListItemService.adapterHideProgress();
            }
        }));
...