我使用的代码如下:
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.
如何从RxAndroid
访问UI
。
我的错误是:
listenerCoursesListItemService.adapterShowProgress();
listenerCoursesListItemService.adapterHideProgress();
发布于 2018-06-13 12:48:45
原因是您正在尝试显示进度->
listenerCoursesListItemService.adapterShowProgress();
内部调用()方法,它实际上运行在不同的线程(Schedulers.io())上,而不是UI线程(AndroidSchedulers.mainThread())上。
相反,您可以在doOnSubscribe()方法中显示进度,并在onComplete()中忽略它。这两个方法都将在UI线程上调用。更新了下面的代码以供参考,
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()方法返回的字符串。
发布于 2018-06-13 06:15:53
您必须对主线程执行subscribeOn操作:
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();
}
}));
https://stackoverflow.com/questions/50819626
复制相似问题