Android Room + AsyncTask

14

我的团队开发了一个新的Android应用程序,它大量使用了Room。

我不确定我们是否正确地使用了AsyncTask。

我们不得不将所有对insert/update/delete的调用都包装在AsyncTasks中,这导致了大量的AsyncTasks。所有对Room的调用都来自后台服务。活动或片段没有直接访问Room - 它们通过LiveData获取所有内容。

插入行的示例调用:

AsyncTask.execute(() -> myModelDAO.insertInstance(myModel));

在DAO中:

@Insert
void insertInstance(MyModel model);
4个回答

23
为了完善@CommonsWare的回答,您可以使用Executor类来将Room查询执行到后台线程中。
Executor myExecutor = Executors.newSingleThreadExecutor();
myExecutor.execute(() -> {
   myModelDAO.insertInstance(myModel)
});

Google在他们的Android Architecture Components 指南中给出了一个示例。


8
这个工作跟AsyncTask相当吗?使用它有什么优点,相比使用AsyncTask,你能解释一下吗? - Jay Dangar

7

所有对 Room 的调用都来自后台服务

那么您不应该使用 AsyncTaskAsyncTask 仅适用于在执行后台工作后要在主应用程序线程上执行工作的情况,而这在服务中几乎从不发生。请使用其他方法(线程、线程池、RxJava 等)。这与 Room 没有特定关系。


1
插入查询可能会锁定 Android UI 线程,这是不允许的。我们需要将插入操作放在后台异步或 RX 中。 - Munish Thakur
@MunishThakur:是的,但是有很多不需要使用AsyncTask的异步工作方式。 - CommonsWare
1
没错,使用lambda和kotlin支持,所有东西都更简短了,甚至异步任务也只需要一行代码就可以完成: AsyncTask.execute({ // 要执行的代码 }) - Munish Thakur

1
AsyncTask.execute(() -> myModelDAO.insertInstance(myModel));

看起来似乎不正确,您可以使用Simple Thread/Threadpool/Schedulers等。


0
你可以使用回调函数,例如:Consumer<List<object>>callback
roomManger.getAllUsertById(user.getId(), this, new Consumer<List<User>>() {
            @Override
            public void accept(List<Product> listOfUser) {
                users.addAll(listOfUser)}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接