人生难得几回搏,此时不搏待何时。这篇文章主要讲述从RxAndroid访问项目布局?相关的知识,希望能为你提供帮助。
我使用下面的代码:
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();
答案原因是你正在努力展示进展 - >
listenerCoursesListItemService.adapterShowProgress();
内部的call()方法实际上运行在不同的线程(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()方法返回的字符串。
另一答案【从RxAndroid访问项目布局()】你必须订阅主线程:
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();
}
}));
推荐阅读
- 在android中的视图中插入视图
- 如何创建WhatsApp中的项目分隔符()
- Android - 使用纯Java而不是XML创建应用程序()
- 样式化单选按钮在android中使用cardview
- 如何在Android中加载带有动画的cardview GridView()
- 为什么android studio会自动在图形布局编辑器中重新排序视图和元素
- Android微调器使用XML进行数据绑定并显示所选值
- 无法使用gradle 2.3.3向android添加bottomnavigation
- Android,XML(gravity = top无法正常工作(截图))