1

アクティビティの 1 つをリファクタリングしようとしています。非常に大きなプライベート AsyncTask クラスがあり、これを別のクラスに配置したいと考えています。AsyncTask 自体も終了時に UI を更新する必要があるため、そのクラスのアプリケーション コンテキストを提供する必要があります。

では、これら 2 つのうちどちらがより優れたアプローチでしょうか。クラスをタスクとして作成するだけですか?

public class MyCustomTask extends AsyncTask

使用:

 new MyCustomTask().execute();

または、それ自体がタスクを起動するアクティビティを作成し、これを意図によるアクティビティと呼びますか?

public class MyCustomActivity extends Activity {
  onCreate() {
    new MyCustomTask().execute();
  }

  private class MyCustomTask extends AsyncTask<..>();
}

使用:

Intent intent = new Intent(this, MyCustomActivity.class);
4

4 に答える 4

3

別の AsyncTask があり、postExecute で UI 操作を行う必要がある場合、それを実行するには 3 つの方法があります。

  1. あなたのアクティビティでそれをオーバーライドします。サブクラスでは、UI 操作コードのみを追加します。

  2. インターフェイスを作成し、それをリスナーとして使用します。ここを参照

  3. アクティビティをパラメーターとして AsyncTask に渡します。ここを参照

2 と 3 では、アクティビティが postExecute() でまだ生きているかどうかを確認します。

于 2012-05-30T17:28:02.480 に答える
2

アクティビティで ASyncTask を行う方法は次のとおりです。

public class MyClass extends Activity {

     @Override
     public void onClick(View v) {
          MyNewThread thread = new MyNewThread();
          thread.execute();
     }

     private class MyNewThread extends ASyncTask<Void, Void, Void> {
          //Code goes here
     }

}

非常に疑似コードですが、おわかりのように、これはアクティビティの単なる内部プライベート クラスです。この正確なスレッドが複数のアクティビティで実行されるものである場合は、それを独自のクラスにする価値があるかもしれません。しかし、ここでこれを行うだけであれば、この実装で問題ありません。いずれにせよ、それをアクティビティにしないでください。これは、ASyncTask を拡張する単なる通常のクラスです。

于 2012-05-30T17:26:11.050 に答える
1

Activityを起動するためだけに別の を作成する理由はありませんAsyncTask。別のクラスとして作成し、Context必要に応じて を渡します。漏れないようにするだけです。

于 2012-05-30T17:16:49.517 に答える