Android:存储空间函数使用Room返回false

问题描述

我已经在“回收站视图”项中添加了“收藏夹”按钮,并使用“房间”来保存收藏夹数据。发生的情况是即使数据库中存在数据,存储库功能isFavourites也会返回false。

由于Room不应该在主线程上运行,因此我正在使用Executors,并且在登录时,我意识到Executors方法内部的布尔变量返回true,但是在外部,它返回错误。

我该如何解决?

FavoriteDAO.java

@Dao
public interface FavouriteDao {

    @Query("SELECT EXISTS (SELECT 1 FROM favourites WHERE id=:id)")
    public boolean isFavourite(int id); 

}

FavouriteRepository.java

boolean isFavourite(int id) {
            final boolean[] b = new boolean[1];
            Executors.newSingleThreadExecutor().execute(() -> {
                b[0] = favouriteDao.isFavourite(id);
                Log.d(TAG,"Favourite is" + b[0]); <--- returns true if data exists
            });
            Log.d(TAG,"Favourite is" + b[0]); <--- returns false always
            return b[0];
        }

FavouriteViewModel.java

 public boolean isFavourite(int id) {   return mRepository.isFavourite(id); }

这总是在Activity中返回false:

  boolean isFavourite = favouriteViewModel.isFavourite(id);

解决方法

您要在异步任务完成之前检查布尔值,因此您始终会读取其默认值falseExecutor任务完成时,您需要某种回调:

Java executors: how to be notified,without blocking,when a task completes?

您还可以使用RXJava,它具有内置的解决方案。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...