AsyncTask <arg1、arg2、arg3>に渡される引数は何ですか?


157

私はここに何を入れるべきか、そしてこれらの議論はどこに終わるのか理解できませんか?正確には何を入れればよいのでしょうか。3つすべてを含める必要がありますか、それとも1、2、20を含めることができますか?

回答:


496

GoogleのAndroidドキュメントは次のように述べています:

非同期タスクは、Params、Progress、Resultと呼ばれる3つのジェネリック型と、onPreExecute、doInBackground、onProgressUpdate、onPostExecuteと呼ばれる4つのステップで定義されます。

AsyncTaskのジェネリック型:

非同期タスクで使用される3つのタイプは次のとおりです。

Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.

すべてのタイプが常に非同期タスクで使用されるわけではありません。タイプを未使用としてマークするには、Voidタイプを使用します。

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

さらに参照できます:http : //developer.android.com/reference/android/os/AsyncTask.html

または、Sankar-Ganeshのブログを参照して、AsyncTaskの役割を明確にできます。

典型的なAsyncTaskクラスの構造は次のようになります。

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){

    }

このメソッドは、新しいスレッドを開始する前に実行されます。入出力値はないので、変数または必要な操作を初期化するだけです。

    protected Z doInBackground(X...x){

    }

AsyncTaskクラスで最も重要なメソッド。ここで、バックグラウンドで実行したいすべてのものをメインのスレッドとは別のスレッドに配置する必要があります。ここでは、タイプ「X」のオブジェクトの配列を入力値として(ヘッダーに表示されますか?「... extends AsyncTask」があります。これらは入力パラメーターのタイプです)、タイプからオブジェクトを返します。 「Z」。

   protected void onProgressUpdate(Y y){

   }

このメソッドは、メソッドpublishProgress(y)を使用して呼び出され、通常、バックグラウンドで実行中の操作の進行状況を示す進行状況バーなど、進行状況や情報をメイン画面に表示する場合に使用されます。

  protected void onPostExecute(Z z){

  }

このメソッドは、バックグラウンドでの操作が完了した後に呼び出されます。入力パラメーターとして、doInBackgroundメソッドの出力パラメーターを受け取ります。

X、Y、Zタイプについてはどうですか?

上記の構造から推測できるように:

 X  The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y  The type of the objects you are going to enter in the onProgressUpdate method.

 Z  The type of the result from the operations you have done in the background process.

このタスクを外部のクラスからどのように呼び出すのですか?次の2行だけです。

MyTask myTask = new MyTask();

myTask.execute(x);

ここで、xはタイプXの入力パラメーターです。

タスクを実行すると、「外部」からそのステータスを確認できます。「getStatus()」メソッドを使用します。

 myTask.getStatus();

次のステータスを受け取ることができます。

実行中 -タスクが実行中であることを示します。

PENDING-タスクがまだ実行されていないことを示します。

FINISHED -onPostExecute(Z)が終了したことを示します。

AsyncTaskの使用に関するヒント

  1. メソッドonPreExecute、doInBackground、およびonPostExecuteを手動で呼び出さないでください。これはシステムによって自動的に行われます。

  2. 別のAsyncTaskまたはスレッド内でAsyncTaskを呼び出すことはできません。メソッドexecuteの呼び出しは、UIスレッドで行う必要があります。

  3. onPostExecuteメソッドは、UIスレッドで実行されます(ここで、別のAsyncTaskを呼び出すことができます!)。

  4. タスクの入力パラメーターはObject配列にすることができます。これにより、必要なオブジェクトやタイプを配置できます。


20
完璧な説明男
Kalai.G

30
Googleよりも優れています。
Diolor 2014年

25
+1。SOメンバー、注意してください。これはあなたが説明する方法です。長いですが、とてもわかりやすいです。カーティックさん、ありがとうございます。
Subby、2014

3
いい説明ですが、今ではAsyntaskについて非常に明確にしています。:)おかげKartik
リーナ・

2
それは私にとって多くのことを解決しました、素晴らしい答え!
マイケル

80

私はパーティーに遅すぎるが、これは誰かを助けるかもしれないと思った。


7
このビジュアルは非常に役に立ちました。コードフローが単純でない場合や、手法やパターンが一般的でない場合に、このようなより多くのビジュアルを使用して、タイプとその関連変数がどのように結び付けられるかを示します。他の人がもっとこれをやってくれることを願っています。ありがとう
Kent Lauridsen、2018

素敵なビジュアル、WeakAsyncTaskも追加できますか?
kAmol 2018

1
確か@kAmol、私はのための流れを作ってみるよWeakAsyncTaskうまくとして
MRID

4
いつかこれを額に入れて壁に貼るので、参照のためにこのスレッドに何度も戻ってくる必要はありません。
Matt Robertson、

14

単純にする!

アンは、AsyncTaskバックグラウンドスレッドで実行されるバックグラウンドタスクです。入力を受け取り、進行状況を実行し、出力を提供します。

すなわちAsyncTask<Input,Progress,Output>

私の意見では、混乱の主な原因は、のパラメーターを記憶しようとするときAsyncTaskです。
鍵は「覚えない」です。
タスクで実際に実行する必要があることを視覚化できる場合AsyncTask、正しい署名でを書くことは簡単です。入力進行状況出力
何であるかを理解するだけで、問題なく進むことができます。

例えば: ここに画像の説明を入力してください

AsyncTaskの心臓部!

doInBackgound()メソッドは、AsyncTask理由で最も重要なメソッドです

  • このメソッドのみがバックグラウンドスレッドで実行され、データをUIスレッドに公開します。
  • そのシグニチャーはAsyncTaskパラメーターによって変わります。

だから関係を見てみましょう

ここに画像の説明を入力してください

doInBackground()そしてonPostExecute()onProgressUpdate()また関連しています

ここに画像の説明を入力してください

コードを表示
それでは、DownloadTaskのコードをどのように記述しますか?

DownloadTask extends AsyncTask<String,Integer,String>{

      @Override
      public void onPreExecute()
      {}

      @Override
      public String doInbackGround(String... params)
      {
               // Download code
               int downloadPerc = // calculate that
               publish(downloadPerc);

               return "Download Success";
      }

      @Override
      public void onPostExecute(String result)
      {
          super.onPostExecute(result);
      }

      @Override
      public void onProgressUpdate(Integer... params)
      {
             // show in spinner, access UI elements
      }

}

このタスクをどのように実行しますか

new DownLoadTask().execute("Paradise.mp3");

1
// show in spinner, access UI elements以下のための最も簡単な説明ダウンだけで手だったonProgressUpdate(...):)
ボルカングベン

5

次のリンクを参照してください。

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

4つ以上の引数を渡すことはできません。1つの引数のみを渡したい場合は、他の2つの引数にはvoidを使用します。

1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 


2. protected class InitTask extends AsyncTask<Context, Integer, Integer>

非同期タスクは、バックグラウンドスレッドで実行され、その結果がUIスレッドで公開される計算によって定義されます。非同期タスクは、Params、Progress、Resultと呼ばれる3つのジェネリック型と、onPreExecute、doInBackground、onProgressUpdate、onPostExecuteと呼ばれる4つのステップで定義されます。

KPBird


3
  • つまり、AsyncTaskには3つのパラメータがあります。

    1. DoInBackground(String ... params)での入力用パラメーター

    2. OnProgressUpdate(String ... status)で使用する進捗状況を表示するためのパラメーター

    3. OnPostExcute(String ... result)で結果を使用するためのパラメータ

    注:-[パラメーターのタイプは要件によって異なる場合があります]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.