只有创建视图层次结构的原始线程才能使用Rxjava触摸其视图

时间:2018-08-06 16:23:47

标签: android android-layout rx-java2

我的问题是我在bottomNavigationView上快速单击多次时出现错误:

  

只有创建视图层次结构的原始线程可以触摸其视图。

我使用bottomNavigationView处理了Rxbinding次点击。 model.getNews()重新运行可观察到的Single<>

我处理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()));

}

2 个答案:

答案 0 :(得分:1)

我认为您需要在流的下方添加另一个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()));

}

答案 1 :(得分:0)

这可能不是针对为什么的直接修复,您的代码试图从非主线程访问视图,但是我相信一个简单的创可贴修复将只是消除对bottomNavigationView的单击。

该代码看起来像这样(从内存中,所以如果这不起作用,请告诉我):

RxBinding.clicks(bottomNavigationView)
    .debounce(
        300 /* Time to debounce according to TimeUnit specified below */,
        TimeUnit.MILLIS
    )
    // .... continue with the rest of your Rx chain