回答:
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の役割を明確にできます。
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の使用に関するヒント
メソッドonPreExecute、doInBackground、およびonPostExecuteを手動で呼び出さないでください。これはシステムによって自動的に行われます。
別のAsyncTaskまたはスレッド内でAsyncTaskを呼び出すことはできません。メソッドexecuteの呼び出しは、UIスレッドで行う必要があります。
onPostExecuteメソッドは、UIスレッドで実行されます(ここで、別のAsyncTaskを呼び出すことができます!)。
タスクの入力パラメーターはObject配列にすることができます。これにより、必要なオブジェクトやタイプを配置できます。
WeakAsyncTask
うまくとして
アンは、AsyncTask
バックグラウンドスレッドで実行されるバックグラウンドタスクです。入力を受け取り、進行状況を実行し、出力を提供します。
すなわち
AsyncTask<Input,Progress,Output>
。
私の意見では、混乱の主な原因は、のパラメーターを記憶しようとするときAsyncTask
です。
鍵は「覚えない」です。
タスクで実際に実行する必要があることを視覚化できる場合AsyncTask
、正しい署名でを書くことは簡単です。入力、進行状況、出力が
何であるかを理解するだけで、問題なく進むことができます。
doInBackgound()
メソッドは、AsyncTask
理由で最も重要なメソッドです
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");
// show in spinner, access UI elements
以下のための最も簡単な説明ダウンだけで手だったonProgressUpdate(...)
:)
次のリンクを参照してください。
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