В комнате аннотация @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, чтобы отобразить всплывающее уведомление об успешном удалении. Естественно, я получаю это исключение (поскольку в цепочке отсутствуетObservOn)
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.