【问题标题】:subscribeOn() not taking work off the main threadsubscribeOn() 没有从主线程中移除工作
【发布时间】:2018-02-09 21:17:29
【问题描述】:

我将 RxJava2 与 Room SQLite 一起使用。我的 DAO:

@Dao
public interface HeroDao {
    @Insert
    long create(Hero hero);
}

这就是我在 RxJava2 中使用它的方式:

Observable.just((int) heroDao.create(hero))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(id -> /** do stuff **/);

但是当我运行应用程序时,我在 Logcat 中得到的错误是 Cannot access database on the main thread since it may potentially lock the UI for a long period of time.我已经尝试将 .allowMainThreadQueries() 附加到数据库构建器并且插入通过,以便确认我的 observable 的正确性。看来 LiveData 和 AsyncTasks 是我可以尝试的其他方法,但是当我已经对 RxJava2 进行了大量投资时,我宁愿不去那里。

那么为什么我会收到这个错误? subscribeOn(Schedulers.io()) 不足以从主线程中卸载工作吗?否则我怎么做到这一点?似乎将 Room 查询转换为我遗漏的 observable 有一些微妙之处?

【问题讨论】:

    标签: android rx-java2 android-room


    【解决方案1】:

    因为你使用了Observable.just。该方法只是将对象包装到Observable中,因此它是在实际订阅之前创建的,并在主线程上调用heroDao.create(hero)。你应该使用Observable.fromCallable(),或者更喜欢Single.fromCallable。 您也可以在 DAO 中定义方法,例如 @Insert Single<Int> create(Hero hero);

    有些链接可能会有所帮助:
    Doing queries in Room with RxJava
    7 Pro-tips for Room

    【讨论】:

      【解决方案2】:

      @Dmitry Ikryanov 的答案是正确的,但是 你也可以使用defer()

      createQuery().subscribeOn(Schedulers.io())
                          .observeOn(AndroidSchedulers.mainThread())
                          .subscribe(intger -> {
                                      //do sth with intege
                                  Thread.currentThread().getName());
                                  },
                                  Throwable::printStackTrace
                          );
                    }
      
      
        public Observable<Integer> createQuery() {
          return Observable.defer(() -> {
              try {
                  return Observable.just((Integer) heroDao.create(hero));
              } catch (Exception e) {
                  return Observable.error(e);
              }
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        相关资源
        最近更新 更多