14

Javaでは、での作業に慣れてきましたFutures。今私はAndroidを見ていて、AsyncTaskほぼすべて同じメソッドを実装し、同様のライフサイクルをカバーしています。ただし、一貫性を保ち、コード全体でFutureを使用したい場合は、AsyncTaskを愚かなラッパーでラップする必要があります。これは実際にはFutureを実装していないためです。

追加する必要があるのはisDone()メソッドだけです。これは簡単なようですが、次に追加しimplements Future<Result>ます。(後で追加:それがどれほど些細なことかについては、以下の私の答えを参照してください)。

Androidの専門家は、これが行われなかった理由を引き起こす可能性のあるいくつかの正当な理由/あいまいなバグを知っていますか?

4

3 に答える 3

7

AsyncTask を Future に使用しない「理由」の理論的な理由にまだ興味があります。

しかし、記録のために、私は自分の小さなクラスを作成することになりました (以下に表示)。Future が必要な場合は、AsyncTask の代わりに拡張するだけです。IMO、コード内のプライベート mFuture にアクセスするという @Eng.Fouad のアイデアよりもクリーンな方法です。(しかし、アイデアのおかげで、ソース コードを少し調べることができました!) YMMV。

public abstract class FutureAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> implements Future<Result>{

   @Override
   public boolean isDone() {
      return AsyncTask.Status.FINISHED == getStatus();
   }
}
于 2012-07-14T16:53:58.587 に答える
1

AsyncTask単純すぎる。これは、数秒かかる可能性がある短いタスクを対象としていますが、UI スレッドをロックしたくない場合に使用します。実際に が必要な場合は、タスクがとにかくFuture複雑すぎる可能性があります。AsyncTask

のステータスは、AsyncTaskを呼び出して確認できgetStatus()ます。これはStatus.PENDINGStatus.RUNNINGまたはのいずれかの列挙型を返しStatus.FINISHEDます。

于 2012-07-14T16:43:07.117 に答える