在室内,@Delete
注释不会发出任何内容。这就是dao
的样子
@Dao
public interface UserDao {
@Delete
void deleteUser(User user);
//We can't use Maybe or Single or anything here
}
这使得在执行
之类的操作时出现问题 userRepository.deleteUser().subscribeOn
因为dao
没有排放。我使用以下代码在后台线程上调用deleteUser。
Observable.just(appDatabase).
subscribeOn(SchedulerProvider.getInstance().computation()).
subscribe(db -> {
userRepository.logoutUser(loggedUser.getLoggedInUser());
loggedUser.setLoggedInUser(null);
}, this::handleError);
这很好用。但是,在订阅方法中,我现在需要访问Android UI以显示宣布成功删除的Toast。当然,我得到这个例外(因为链中缺少observeOn)
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
然而,当我把observeOn
像这样
Observable.just(appDatabase).
subscribeOn(SchedulerProvider.getInstance().computation()).
observeOn(SchedulerProvider.getInstance().ui()).
subscribe(db -> {
userRepository.logoutUser(loggedUser.getLoggedInUser());
loggedUser.setLoggedInUser(null);
Message message = new Message(R.string.user_logged_out_msg);
message.setMessageType(Message.MessageType.SUCCESS_MESSAGE);
view.showMessages(Arrays.asList(message)); //this leads to a taost
}, this::handleError);
我奇怪地得到了这个例外:
cannot access database on the main thread since it may potentially lock the UI for a long period of time.
答案 0 :(得分:3)
基于以下问题的信息:Run Void Method in Backgound (StackOverflow)
使用Completable并订阅另一个线程,如下所示:
Completable.fromAction(this::clearCachedData).subscribeOn(Schedulers.single()).subscribe();
为我工作。 clearCachedData
方法在我正在呼叫的Room中执行查询。
我的查询是:
/**
* Delete all data in the items table.
*/
@Query("DELETE FROM items")
void deleteWeatherItems();
答案 1 :(得分:2)
我知道这已经很晚了。但我遇到了同样的问题,并能够通过以下
来解决它在Dao班
@Query("DELETE FROM users")
fun deleteAllUser()
这样称呼它。这样您就可以订阅,它将在后台运行。
Single.fromCallable {
user.deleteAllUser() //User Dao fun
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(..do stuff..)
答案 2 :(得分:0)
将Observable 只是方法替换为创建。
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(@io.reactivex.annotations.NonNull ObservableEmitter<Object> e) throws Exception {
e.onNext(tileDatabase.getCategoryDeo().deleteCategory(category));
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Object>() {
@Override
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
}
@Override
public void onNext(@io.reactivex.annotations.NonNull Object o) {
Toast.makeText(MainActivity.this, "Record deleted ", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
答案 3 :(得分:-1)
FormBuilder
这些方法可能很有用。