繁体   English   中英

subscribeOn()没有从主线程中取消工作

[英]subscribeOn() not taking work off the main thread

我正在使用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())足以卸载主线程的工作? 否则我该怎么做? 似乎有一些细微之处在于将房间查询转换为我遗漏的可观察对象?

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

有一些链接可能会有所帮助:
使用RxJava在Room中进行查询
7个房间的专业提示

@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);
        }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM