1

私は、ネットワーク "ヘビー"コールを行うスタティックメソッドを持っています。これは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が "制御"されていない/キャンセルされていないと思います。
ここでの問題は何ですか?

+1

AsyncTaskのドキュメンテーションによれば、2秒以上かかるタスクを実行してネットワーク重度のコールを排除することはできません。このドキュメントでは、ExecutorServiceまたはFutureTaskの使用をさらに提案しています。私がそれを見る方法で、あなたはFutureTaskを構築し、それをExecutorServiceにpssすることができます。キャンセルする必要がある場合は、あなたが保持しているFutureオブジェクトでキャンセルを呼び出すことができます。これに対してAsyncTaskは削除されません。 – Madhusudhan

+0

私のユースケースに最も適切な構成は何ですか?サービス? – Jim

+1

長いタスクに使用しない理由は、デフォルトではすべてのAsyncTaskが同じスレッドで起動するためです。したがって、executeOnExecutor経由で独自のスレッドで明示的に起動しないと、将来のすべてのAsyncTaskを保持します。 –

答えて

0

私は実際に、それは状態を解除付着するAsyncTaskの開発者次第ですAsyncTaskを

/キャンセルなどを「制御」されていないと思います。

AsyncTaskは、プロセスのライフサイクルに結びついています。だから、メモリリーク(静的宣言で解決しました)のようないくつかの問題があるかもしれませんが、バックグラウンドプロセスではpriority list for killingの値が低いことに注意してください。あなたがそれでOKでない場合は、サービスを使用してください。

アクティビティのライフサイクルに縛られたい場合は、AsyncTaskLoaderを使用します。

UIスレッドで結果を公開する予定がない場合は、標準のJavaスレッドを使用できます。

キャッシングを使用しているネットワーク用のものについては、DBを使用します。サービスを使用します。

関連する問題