【发布时间】:2017-12-21 08:55:32
【问题描述】:
在房间里,@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);
这很好用。但是,在 subscribe 方法中,我现在需要访问 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.
【问题讨论】:
-
虽然我没有给你一个明确的答案,但我可以说 Room 默认在后台线程上调用它的 RXJava,所以你不需要显式调用 subscibeOn() 但你确实需要确保您调用观察以将活动推送到 UI 线程。如果我是你,这就是我会关注的区域。
-
“我使用下面的代码在后台线程上调用 deleteUser”——你没有调用
deleteUser()。您可能希望同步您的示例,以使它们保持一致。
标签: android rx-java2 rx-android android-room