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 执行三个操作:
- 将本地更改推送到服务器(使用 Room 查询本地数据库并发布到 REST Api);
- 获取服务器数据(查询 REST Api 并使用 Room 保存到本地 DB);
- 从本地数据库中删除旧的(不必要的)数据(使用 Room 删除)。
目前,当我需要使用 room 访问本地数据库时,我使用了 AsyncTask,所以我没有收到错误说我无法从主线程访问数据库。
但是,我还必须使用 retrofit2 enqueue 查询或发布到 REST Api,因此它在另一个线程中运行。代码变得一团糟,因为我只能在当前一个完成后调用下一步,并且在另一个线程中创建一个线程,调试很痛苦。
这样对吗?我不应该使用另一个线程选项吗?