Androidの非同期タスクAsyncTaskの詳細

4396 ワード

AsyncTask、その名の通り、非同期タスク.非同期といえば、最も簡単な理解は非同期です.もう少し複雑に理解すれば、例を挙げなければなりません.
駅へ切符を買いに行くとしたら、駅に着いたばかりなのに、身分証明書を忘れたことに気づいた.どうしよう?どうしよう!
方法を考えろ!私は学校にいる同級生を探して送ってくれるべきだと思います.自分で持って帰ることができないからです.まだ列に並んでいます.歩けません.はい、誰かに送ってもらいます.しかし問題が来て、私は人を探して身分証明書を送って、私は列に並んで、もし1位に並んで身分証明書がまだ着いていないならばどうしますか?チリン、頭の上に突然小さな電球が点灯して、機知に富んだ私は列に並ぶ前に2つの案を考えました.
第1の方案、切符売りに私を待たせて、私の後ろの列の中で切符を買う人も私を待っていて、私はずっと窓口の第1の位置で同級生が身分証明書を送るのを待っていて、私の身分証明書が送られてくるまで、それから順調に切符を買います.
もう一つの案は、私が切符売りに言って、身分証明書を送りながら、後ろの人が切符を買い続けます.身分証明書が届いたら、できるだけ早く列の1位に並んで(すぐに1位になるとは限らない.もし誰かが切符を買っているので、私は彼を邪魔することはできません)切符を買うことができます.
だから、1つ目か2つ目か.私は必ず2つ目を選びます.1つ目を選ぶと必ず後ろに並んでいる人に叱られて死ぬし、切符売りに叱られる可能性もあります.うまくいかないと殴られます.結局、私一人のため、こんなに多くの人の時間を浪費して、切符売りの仕事の効率を遅らせました.
では、例はここまでです.例では、2つ目の方法は非同期です.非同期はマルチスレッドに関係することが多く、非同期タスクの多くは個別のスレッドに渡されて完了し、結果をプライマリスレッドに返します.ここの切符売りはcpuに相当し、並んで切符を買う人は実行されるのを待つ任務に相当し、私は非同期とマークされた任務(身分証明書を持っていることを知っていて、すぐに切符を買うことができないので、列に並ぶ前に第2の案を考えました)で、cpuが私のこの任務を実行したとき、私のこの任務が実行できる条件(身分証明書)が備えていないことに気づいて、私が非同期任務(同級生が切符を送る)を始めました.実行可能な条件を取得し、すぐに位置を譲り、他のキューに並んでいるタスクを実行させます.私の身分証明書が来るまで、すぐにcpuに接待の準備を知らせてください.
うん、差が少ないのはそうですね.本文を話し始めて、androidの中のAsyncTask.まず前の公式サイトの引用:


AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
英语で、私は大体どういう意味か分かりますが、やはり翻訳しないで、人の子弟を间违えることを恐れて、私の英语がもっとよくなってから翻訳しましょう.しかし、AsyncTaskはUIスレッド上でバックグラウンド操作をしたり、UIスレッド上に操作結果を返したりすることができるという大まかな意味を説明します.UIスレッドは時間のかかる操作ができないことを知っていますが、AsyncTaskがあれば、そうすることができます.でも、


AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as Executor, ThreadPoolExecutor and FutureTask.
時間がかかるタスクについては、AsyncTaskで実行することをお勧めしません.AysncTaskはThreadとHandlerの補助クラスとして設計されており,複雑で時間のかかるタスクを実行することはできないが,このタスクは他の方法ではここでは言わないべきである.AsyncTaskは、xmlやjsonなどのネットワーク操作をネットワークに要求したり、プログラムの初期化インタフェースで使用したりするなど、最大数秒の操作に使用することが望ましい.
以下、AsyncTaskの使用について説明します.実は簡単です.
まずAsyncTaskのサブクラスを定義し、親のdoInBackground(Params...)を書き換える必要があります.方法.また、onPostExecute(Result)メソッドも書き換えることができます.このメソッドはdoInBackgroundの後に自動的に呼び出されるので、ここでタスク完了の通知コードを書くことができます.
まず公式の例をあげます.

private class DownloadFilesTask extends AsyncTask {
  protected Long doInBackground(URL... urls) {
    int count = urls.length;
    long totalSize = 0;
    for (int i = 0; i < count; i++) {
      totalSize += Downloader.downloadFile(urls[i]);
      publishProgress((int) ((i / (float) count) * 100));
      // Escape early if cancel() is called
      if (isCancelled()) break;
    }
    return totalSize;
  }

  protected void onProgressUpdate(Integer... progress) {
    setProgressPercent(progress[0]);
  }

  protected void onPostExecute(Long result) {
    showDialog("Downloaded " + result + " bytes");
  }
 }

AsyncTaskを実行する場合は、UIスレッドで次の文を実行する必要があります.
new DownloadFilesTask().execute(url1, url2, url3);
AsyncTaskを継承する際には、AsyncTaskのようないくつかの汎用タイプがあり、簡単に説明することができます.
最初に入力パラメータを指定できるタイプはnew DownloadFilesTask()です.execute()のパラメータ(最後にdoInBackgroundに渡された)は、ここのパラメータは1つだけでなく、最後にメソッドに届くので、配列が受信されます.2つ目は、送信の進捗更新に必要なタイプを指定できます.一般的には、publishProgress(バックグラウンドプロセスで進捗を送信するための方法で、定義せずに直接使用される)とonProgressUpdateの2つの方法で使用されます.3つ目はAsyncTaskが結果を返すデータ型で、doInBackgroundの戻りタイプとonPostExecuteの入力パラメータタイプを設定しています.もちろん、何も必要ない場合はVoidを使用することができます.
private class MyTask extends AsyncTask { ... }
また、doInBackgroundの前に呼び出されるonPreExecute()という書き換え方法もありますので、必要であれば書き換えてインスタンス化された進捗バーなどの作業をすることができます.
最後に、以下をまとめます.
AsyncTaskを使用して、親を継承し、doInBackground(Params...)を書き換えます.バックグラウンド操作を実装し,戻り結果があればonPostExecute(Result)を書き換えてバックグラウンドプログラムの結果を処理する.
進捗を更新する必要がある場合は、onPreExecute()で進捗バーをインスタンス化し(ここにいなくてもいい)、その後doInBackground(Params...)中にはpublishProgress()で進捗値をパブリッシュし、onProgressUpdate(Progress...)を書き換えます.onPreExecute()が発行した結果を受信し、進捗バーを更新するコードを追加します.
以上、Androidの非同期ミッションについてですが、お気に召していただければと思います.