1

Android アプリで約 10 個以上の http 投稿要求を行う予定です。それらのほとんどは非常に短時間です。

私が理解しているように、UI スレッドでネットワーク操作を実行できません。

これに対する解決策は、AsyncTask を使用するか、Thread を使用することです。

AsyncTask を使用する場合は、その要求用にカスタマイズされたクラスを作成する必要があります。

Thread を使用する場合、ネットワーク操作用の新しいクラスを実装する必要はありません。

ですから、私の質問は、いつ Thread を使用し、いつ AsyncTask オプションを使用する必要があるかということです。短時間のリクエスト用のスレッドを作成し、長時間のネットワーク操作で AsyncTask を拡張するクラスを作成するのは正しいアプローチですか?

4

2 に答える 2

1

いつスレッドを使用し、いつ AsyncTask オプションを使用する必要がありますか?

のドキュメントにAsyncTaskよると:

AsyncTask は、Thread と Handler のヘルパー クラスとして設計されており、一般的なスレッド フレームワークを構成するものではありません。AsyncTasks は、理想的には短い操作 (せいぜい数秒) に使用する必要があります。スレッドを長時間実行し続ける必要がある場合は、次のような java.util.concurrent パッケージで提供されるさまざまな API を使用することを強くお勧めします。 Executor、ThreadPoolExecutor、および FutureTask。

したがって、実行時間の長いタスクがある場合は、独自のフォークを作成するThreadか、ExecutorService. 短いバックグラウンド タスクを実行している場合AsyncTaskは、この方法をお勧めします。

短時間のリクエスト用のスレッドを作成し、長時間のネットワーク操作で AsyncTask を拡張するクラスを作成するのは正しいアプローチですか?

いいえ、上記のドキュメントによると、逆になっています。

Thread を使用する場合、ネットワーク操作用の新しいクラスを実装する必要はありません。

と の両方で、新しいクラスを宣言AsyncTaskするThread必要があります。

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {
       ...
    }
 }
 ...
 // to start it
 new DownloadFilesTask().execute(url1, url2, url3);

スレッドの使用方法は次のとおりです。

 private class DownloadFilesTask implements Runnable {
      // if you need to pass in args via the constructor
      public DownloadFilesTask(URL... urls) {
          ...
      }
      public void run() {
          // do stuff in the background
      }
 }
 ...
 // to start it
 new Thread(new DownloadFilesTask(url1, url2, url3)).start();

バックグラウンド タスクから結果を取得する必要がある場合は、代わりにCallableExecutorServiceクラスを使用することもできます。

Callable を実行まで待機させる方法は?

AsyncTaskもサポートget()します。

于 2012-09-27T16:17:55.467 に答える
1

を使用している場合でも、作業を行うにはのサブクラス (または のサブクラス)Thread.start()を作成する必要があります。どちらの方法でも新しいクラスを作成しています。おそらく唯一の違いは、匿名クラスとトップレベルの名前付きクラスを作成する場合です。クラス。RunnableThread

新しいクラスを作成する必要があるかどうかに基づいて決定を下すべきではありません。コストが小さいためです。新しいファイルを作成すると、構造が異なるなどです。これは単純な 1 回限りのコストです。

AsyncTaskが提供するすべての追加のロジックと機能が必要かどうかに基づいて決定する必要があるように思えます。

于 2012-09-26T19:14:58.453 に答える