Android ルームのクエリはメイン スレッドで実行できないため、通常はアクティビティから 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 は 3 つの操作を行います。
- ローカルの変更をサーバーにプッシュします (Room を使用してローカル DB をクエリし、REST Api にポストします)。
- サーバー データを取得します (REST Api にクエリを実行し、Room を使用してローカル DB に保存します)。
- 古い(不要な)データをローカル DB から削除します(Room を使用して削除します)。
現在、room を使用してローカル DB にアクセスする必要がある場合、AsyncTask を使用しているため、メインスレッドから DB にアクセスできないというエラーは表示されません。
ただし、retrofit2 エンキューを使用して REST Api にクエリまたは投稿する必要があるため、別のスレッドで実行されます。現在のステップが終了した後にのみ次のステップを呼び出すことができるため、コードが混乱し、一方のスレッドが他方のスレッド内に作成されるため、デバッグが苦痛になります。
そうですか?別のスレッド オプションを使用するべきではありませんか?