android:使用CompletableFuture从房间加载列表



由于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;
}

//结束

既然您说过不想使用RxJavacoroutines,而且我不熟悉CompletableFuture,我想建议您在不阻塞UI thread的情况下从数据库中获取数据的最简单方法-使用LiveData。默认情况下,LiveData在sepfrate线程上执行fetch操作,然后通知所有观察者。

以下是必要的步骤:

  1. 将此依赖项添加到渐变

    implementation "androidx.lifecycle:lifecycle-livedata:2.3.1"

  2. 删除所有与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
    }`
    
  • 相关内容

    • 没有找到相关文章

    最新更新