Android 只有创建视图层次结构的原始线程才能使用Rxjava接触其视图
我的问题是,当我在Android 只有创建视图层次结构的原始线程才能使用Rxjava接触其视图,android,android-layout,rx-java2,Android,Android Layout,Rx Java2,我的问题是,当我在bottomNavigationView上多次快速单击时,出现了一个错误。我遇到了这个错误: 只有创建视图层次结构的原始线程才能接触其视图 我使用Rxbinding处理bottomNavigationView单击。 model.getNews()retrun一个Singleobservable 我处理bottomNavigationView单击的代码是: private Disposable loadNews(int categoryNumber) { ret
bottomNavigationView
上多次快速单击时,出现了一个错误。我遇到了这个错误:
只有创建视图层次结构的原始线程才能接触其视图
我使用Rxbinding
处理bottomNavigationView
单击。
model.getNews()
retrun一个Single
observable
我处理bottomNavigationView
单击的代码是:
private Disposable loadNews(int categoryNumber) {
return model.getNews(1, categoryNumber, OrderBy.DESC)
.observeOn(AndroidSchedulers.mainThread())
.doFinally(() -> view.showLoading(false))
.doOnSubscribe(__ -> view.showLoading(true) )
.subscribeOn(Schedulers.io())
.retry()
.map(NewsResponse::newsDetails)
.subscribe(newsDetails -> view.setUpRecyclerView(newsDetails),
throwable -> ToastUtils.showShort("Error " + throwable.getMessage()
+ "Caused by " + throwable.getCause()));
}
<> P>这可能不是您的代码试图从非主线程访问视图的直接修复,但我相信一个简单的创可贴补丁只会消除ButoMavigaseVIEW上的点击。 代码看起来像这样(从内存中,所以如果这不起作用,请告诉我):
我认为您需要在流的下面添加另一个observeOn(AndroidSchedulers.mainThread()),如下所示:
private Disposable loadNews(int categoryNumber) {
return model.getNews(1, categoryNumber, OrderBy.DESC)
.observeOn(AndroidSchedulers.mainThread())
.doFinally(() -> view.showLoading(false))
.doOnSubscribe(__ -> view.showLoading(true) )
.subscribeOn(Schedulers.io())
.retry()
.map(NewsResponse::newsDetails)
.observeOn(AndroidSchedulers.mainThread()) <-- HERE!
.subscribe(newsDetails -> view.setUpRecyclerView(newsDetails),
throwable -> ToastUtils.showShort("Error " + throwable.getMessage()
+ "Caused by " + throwable.getCause()));
}
private一次性加载新闻(int categoryNumber){
return model.getNews(1,categoryNumber,OrderBy.DESC)
.observeOn(AndroidSchedulers.mainThread())
.doFinally(()->view.showLoading(false))
.doOnSubscribe(_->view.showLoading(true))
.subscribeOn(Schedulers.io())
.重试()
.map(NewsResponse::newsDetails)
.observeOn(AndroidSchedulers.mainThread())视图.setUpRecyclerView(新闻详细信息),
throwable->ToastUtils.showShort(“错误”+throwable.getMessage()
+由“+throwable.getCause())引起的”;
}
它实际上不起作用,它将流转换为RxComputing pool thread
抱歉,我不确定我是否理解。您尝试了此代码,但它不起作用?它也起作用,谢谢doafterminate
而不是doFinally
起作用
private Disposable loadNews(int categoryNumber) {
return model.getNews(1, categoryNumber, OrderBy.DESC)
.observeOn(AndroidSchedulers.mainThread())
.doFinally(() -> view.showLoading(false))
.doOnSubscribe(__ -> view.showLoading(true) )
.subscribeOn(Schedulers.io())
.retry()
.map(NewsResponse::newsDetails)
.observeOn(AndroidSchedulers.mainThread()) <-- HERE!
.subscribe(newsDetails -> view.setUpRecyclerView(newsDetails),
throwable -> ToastUtils.showShort("Error " + throwable.getMessage()
+ "Caused by " + throwable.getCause()));
}