由于AsyncTask((方法已被弃用,我正在尝试替换它。以前AsyncTask((用于将CardViews从Room数据库加载到RecyclerView列表中。我正在尝试使用CompletableFuture((作为替换,但列表没有加载。刀法;列出getAllCards(("正在Android Studio中给出错误消息";该方法的返回值从未使用过";所以听起来这个列表从来没有从数据库中获得过。Repository从ViewModel获取List方法,ViewModel在MainActivity中获取List方法调用。
我还想避免";ExecutiorService.submit(((->cardDao((.get(("加载列表,因为它正在阻塞。我在下面展示了运行良好的ExecutorService submit((方法,以供参考。
由于列表未加载,我在这里缺少什么?
Repository
public List<Card> getAllCards() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
CompletableFuture.supplyAsync(() -> {
List<Card> loadAllCards = new ArrayList<>();
cardDao.getAllCards();
return loadAllCards;
}).thenAcceptAsync(loadAllCards -> getAllCards());
}
return null;
}
Dao
@Dao
public interface QuickcardDao {
@Query("SELECT * FROM cards ORDER BY Sortorder DESC")
List<Card> getAllCards();
}
这是我试图替换的存储库中的AsyncTask((:
public CardRepository(Application application) {
CardRoomDatabase db = CardRoomDatabase.getDatabase(application);
cardDao = db.cardDao();
}
public List<Card> getAllCards() {
try {
return new AllCardsAsyncTask(cardDao).execute().get();
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
return null;
}
// AsyncTask for reading an existing CardViews from the Room database.
private static class AllCardsAsyncTask extends AsyncTask<Void, Void, List<Card>> {
private CardDao cardDao;
AllCardsAsyncTask(CardDao dao) {
cardDao = dao;
}
@Override
public List<Card> doInBackground(Void... voids) {
return cardDao.getAllCards();
}
}
这是我试图替换的存储库中的submit(((方法:
public List<Card> getAllCards() {
List<Card> newAllCards = null;
try {
newAllCards = CardRoomDatabase.databaseExecutor.submit(() -> cardDao.getAllCards()).get();
}
catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return newAllCards;
}
//结束
既然您说过不想使用RxJava
或coroutines
,而且我不熟悉CompletableFuture
,我想建议您在不阻塞UI thread
的情况下从数据库中获取数据的最简单方法-使用LiveData
。默认情况下,LiveData
在sepfrate线程上执行fetch操作,然后通知所有观察者。
以下是必要的步骤:
-
将此依赖项添加到渐变
implementation "androidx.lifecycle:lifecycle-livedata:2.3.1"
-
删除所有与Asynctask或CompletableFuture 相关的代码
将如下方法添加到您的@Dao
注释类中
@Dao
public interface QuickcardDao {
@Query("SELECT * FROM cards ORDER BY Sortorder DESC")
LiveData<List<Card>> getAllCards();}
将方法添加到您的回购中,如下
public LiveData<List<Card>> getAllCards() {
return cardDao.getAllCards();
}
将方法添加到ViewModel中,如下所示:
public LiveData<List<Card>> getAllCardsLive{ return repo.getAllCards(); }
在活动中观察LiveData
`viewModel.getAllCardsLive().observe(getViewLifeycleOwner(), cards ->{
// submit obtained cards lit to your adapter
}`