私は、ネットワーク "ヘビー"コールを行うスタティックメソッドを持っています。これはgetDataFromCloudServer()
としましょう。今度は、このメソッドを持つ新しい手持ちのユーティリティメソッドが作成されます。
例:小規模のバックグラウンドタスクのオプション
public static void periodicUpdate(Context ctx) {
clearCachedData();
List<Object> newData = getDataFromCloudServer(ctx);
persist(newData);
}
この新しい便利な方法は、UIスレッド上のイベントが発生したときにトリガをする必要があります。しかし、明らかに私はUIスレッドから呼び出すことはできません。
は、だから私は考え発信者に小さな匿名AsyncTasksを避けるしたい:これは良いアイデアである場合
public static void periodicUpdateInAsyncTask(final Context ctx) {
AsyncTask<Void, Void, Void> updaterTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
periodicUpdate(ctx);
}
};
updaterTask.execute();
}
私の懸念があります。基本的に私は、AsyncTaskが "制御"されていない/キャンセルされていないと思います。
ここでの問題は何ですか?
AsyncTaskのドキュメンテーションによれば、2秒以上かかるタスクを実行してネットワーク重度のコールを排除することはできません。このドキュメントでは、ExecutorServiceまたはFutureTaskの使用をさらに提案しています。私がそれを見る方法で、あなたはFutureTaskを構築し、それをExecutorServiceにpssすることができます。キャンセルする必要がある場合は、あなたが保持しているFutureオブジェクトでキャンセルを呼び出すことができます。これに対してAsyncTaskは削除されません。 – Madhusudhan
私のユースケースに最も適切な構成は何ですか?サービス? – Jim
長いタスクに使用しない理由は、デフォルトではすべてのAsyncTaskが同じスレッドで起動するためです。したがって、executeOnExecutor経由で独自のスレッドで明示的に起動しないと、将来のすべてのAsyncTaskを保持します。 –