6

DDMSでAsyncTasksチェックを使用すると、スレッドはonPostExecute()メソッドの後に待機スレッドとしてメモリに保持されます。ここに私の問題を再現し、簡略化の活動は以下のとおりです。実行後にAsyncTaskスレッドがまだそこにあるのですか?

package com.example.async; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 

public class ASyncTaskExampleActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    new ExampleAsyncTask().execute(); 
} 


private class ExampleAsyncTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     for (int i =0; i<50000;i++){ 
      int j=i*2; 
     } 
     return null; 
    } 

    protected void onPostExecute(Void result) { 
     Log.d("Test","End onPostExecute"); 
    } 

} 

}

答えて

3

うん、これはあなたが後に別のAsyncTaskを提出する場合は、次のAsyncTask

を提出スレッドを殺害し、再起動のオーバーヘッドを回避します最初に完了した同じスレッドは再利用されます

7

AsyncTaskは「スレッドプール」手法を使用します。開始する各AsyncTaskはキューに入ります。 「プール」には、タスクを待っているアイドル状態のスレッドがいくつかあります(または、それらは一定の制限まで必要に応じて作成されます)。プールからのアイドル状態のスレッドは、AsyncTaskを取得して実行し、プールに戻ります。その後、キューにタスクがなくなるまでプロセスが繰り返されます。

このアプローチは、2つの重要な機能がありません:スレッドを作成するためのオーバーヘッドを

  1. をタスクシステムのパフォーマンスの膨大な数の場合は
  2. たびは、優雅を劣化させる:タスクのほとんどが待っています待ち行列内にあり、一度に実行されるのは です。最終的にはすべてが処刑されます。 それ以外の場合、タスクごとに個別のスレッドが開始された場合、 システムでメモリまたはスレッドが不足する可能性があります。また、タスクは終了するまでには になります。

AsyncTaskの完了後にDDMSに表示されるスレッドは、プール内のアイドル状態のスレッドです。

0

こちらの回答は両方とも正しいです。それに加えて、プール内のそのようなスレッドのステータスは「待機」になります。この現象は、ネットワーク操作に接続プールを使用するOkhttpなどのライブラリを使用している場合にも発生する可能性があります。

関連する問題