android – 用room执行删除(rxjava)

前端之家收集整理的这篇文章主要介绍了android – 用room执行删除(rxjava)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在室内@Delete注释不会发出任何东西.这就是dao的样子

  1. @Dao
  2. public interface UserDao {
  3. @Delete
  4. void deleteUser(User user);
  5. //We can't use Maybe or Single or anything here
  6. }

这使得在做类似事情时出现问题

userRepository.deleteUser().subscribeOn,因为我们没有排放到dao.我使用以下代码后台线程上调用deleteUser.

  1. Observable.just(appDatabase).
  2. subscribeOn(SchedulerProvider.getInstance().computation()).
  3. subscribe(db -> {
  4. userRepository.logoutUser(loggedUser.getLoggedInUser());
  5. loggedUser.setLoggedInUser(null);
  6. },this::handleError);

这很好用.但是,在订阅方法中,我现在需要访问Android UI以显示宣布成功删除的Toast.当然,我得到这个例外(因为链中缺少observeOn)

  1. java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

但是当我把observeOn放在这样的时候

  1. Observable.just(appDatabase).
  2. subscribeOn(SchedulerProvider.getInstance().computation()).
  3. observeOn(SchedulerProvider.getInstance().ui()).
  4. subscribe(db -> {
  5. userRepository.logoutUser(loggedUser.getLoggedInUser());
  6. loggedUser.setLoggedInUser(null);
  7. Message message = new Message(R.string.user_logged_out_msg);
  8. message.setMessageType(Message.MessageType.SUCCESS_MESSAGE);
  9. view.showMessages(Arrays.asList(message)); //this leads to a taost
  10. },this::handleError);

我奇怪地得到这个例外:

  1. cannot access database on the main thread since it may potentially lock the UI for a long period of time.
最佳答案
我知道这已经很晚了.但我遇到了同样的问题,并能够通过以下方式解决

在道类

  1. @Query("DELETE FROM users")
  2. fun deleteAllUser()

像这样称呼它.这样您就可以订阅它,它将在后台运行.

  1. Single.fromCallable {
  2. user.deleteAllUser() //User Dao fun
  3. }
  4. .subscribeOn(Schedulers.io())
  5. .observeOn(AndroidSchedulers.mainThread())
  6. .subscribe(..do stuff..)

猜你在找的Android相关文章