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()));

}