问题描述
我已经在“回收站视图”项中添加了“收藏夹”按钮,并使用“房间”来保存收藏夹数据。发生的情况是即使数据库中存在数据,存储库功能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);
解决方法
您要在异步任务完成之前检查布尔值,因此您始终会读取其默认值false
。 Executor
任务完成时,您需要某种回调:
Java executors: how to be notified,without blocking,when a task completes?
您还可以使用RXJava,它具有内置的解决方案。