gpt4 book ai didi

java - 在不观察的情况下从房间中选择数据

转载 作者:行者123 更新时间:2023-12-01 16:49:32 25 4
gpt4 key购买 nike

我需要从表中选择数据,对其进行操作,然后将其插入到另一个表中。仅当应用程序当天首次打开时才会发生这种情况,并且不会在 UI 中使用。我不想使用 LiveData,因为它不需要被观察,但当我研究如何做到这一点时,大多数人说我应该使用 LiveData。我尝试过使用 AsyncTask,但收到错误“无法访问主线程上的数据库,因为它可能......”。这是我的 AsyncTask 的代码

 public class getAllClothesArrayAsyncTask extends AsyncTask<ArrayList<ClothingItem>, Void, ArrayList<ClothingItem>[]> {

private ClothingDao mAsyncDao;
getAllClothesArrayAsyncTask(ClothingDao dao) { mAsyncDao = dao;}


@Override
protected ArrayList<ClothingItem>[] doInBackground(ArrayList<ClothingItem>... arrayLists) {

List<ClothingItem> clothingList = mAsyncDao.getAllClothesArray();
ArrayList<ClothingItem> arrayList = new ArrayList<>(clothingList);
return arrayLists;
}
}

这就是我在 Activity 中调用它的方式

        mClothingViewModel = new ViewModelProvider(this).get(ClothingViewModel.class);
clothingItemArray = mClothingViewModel.getClothesArray();

这种情况下的最佳做法是什么?

最佳答案

简要摘要:

  1. Room 确实不允许在主线程上执行任何操作(查询|插入|更新|删除)。您可以在 RoomDatabaseBuilder 上关闭此控件,但最好不要这样做。
  2. 如果你不关心 UI,至少你可以将你的 ROOM-ish 代码(可运行)放入其中之一 - Thread,Executor,AsyncTask(但它去年已被弃用)......我已经把下面的例子
  3. 我认为这种对数据库的一次性操作的最佳实践是协程(对于那些在项目中使用 Kotlin 的人)和 RxJava(对于那些使用 Java、Single|Maybe 作为返回类型的人)。它们提供了更多的可能性,但您应该投入时间来理解这些机制的要点。
  4. 为了观察来自 Room 的数据流,有 LiveData、Coroutines Flow、RxJava (Flowable)。

使用启用 lambda 的线程切换的几个示例(如果您出于某种目的不想学习更高级的东西):

  • 只是一个线程

    new Thread(() -> {
    List<ClothingItem> clothingList = mAsyncDao.getAllClothesArray();
    // ... next operations
    });

  • 执行者

    Executors.newSingleThreadExecutor().submit(() -> {
    List<ClothingItem> clothingList = mAsyncDao.getAllClothesArray();
    // ... next operations
    });

  • 异步任务

    AsyncTask.execute(() -> {
    List<ClothingItem> clothingList = mAsyncDao.getAllClothesArray();
    // ... next operations
    });

如果您使用存储库模式,您可以将所有这些线程切换放在那里

Another useful link了解 AsyncTask 弃用后的生活

关于java - 在不观察的情况下从房间中选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61720240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com