2

Android Room 查询无法在主线程上执行,通常我使用 Activity 中的 Handler 或 AsyncTask。但是,当需要在 SyncAdapter 中持久化数据时,在不同线程中执行 Room 查询的正确方法是什么?(我需要对 REST API 进行一些请求并保留结果数据)。

目前我的方式是使用 AsyncTask,但文档说 AsyncTask 应该是短暂的,而且我在上下文泄漏方面遇到了一些麻烦。

static class PushUpdatedTasksToServerAsyncTask extends AsyncTask<Task, Integer, Void> {

        private final Context mContext; // Android Lint alerts a possible context leak
        private final TaskDAO mDao;

        PushUpdatedTasksToServerAsyncTask(Context context, TaskDAO dao) {
            mContext = context;
            mDao = dao;
        }

更新以澄清当前情况

我的 SyncAdapter 执行三个操作:

  1. 将本地更改推送到服务器(使用 Room 查询本地数据库并发布到 REST Api);
  2. 获取服务器数据(查询 REST Api 并使用 Room 保存到本地 DB);
  3. 从本地数据库中删除旧的(不必要的)数据(使用 Room 删除)。

目前,当我需要使用 room 访问本地数据库时,我使用了 AsyncTask,所以我没有收到错误说我无法从主线程访问数据库。

但是,我还必须使用 retrofit2 enqueue 查询或发布到 REST Api,因此它在另一个线程中运行。代码变得一团糟,因为我只能在当前一个完成后调用下一步,并且在另一个线程中创建一个线程,调试很痛苦。

这样对吗?我不应该使用另一个线程选项吗?

4

0 回答 0