当我在DDMS中使用AsyncTasks检查时,线程在onPostExecute()方法之后作为等待线程保留在内存中,这是正常的吗?这是一个简化的活动,可以重现我的问题:
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");
}
}
}
答案 0 :(得分:7)
AsyncTask使用“线程池”技术。您启动的每个AsyncTask都会进入队列;在“池”中有一些空闲线程(或者根据需要创建它们,直到某个限制)等待任务。池中的空闲线程获取AsyncTask并执行它,然后返回池。然后重复该过程,直到队列中不再有任务为止。
这种方法有两个重要特征:
在AsyncTask完成后在DDMS中看到的线程是池中的空闲线程。
答案 1 :(得分:3)
是的,这可以避免在提交下一个AsyncTask时杀死并重新启动线程的开销
如果您在第一次完成后提交另一个AsyncTask,则会重复使用相同的线程
答案 2 :(得分:0)
这里提供的答案都是正确的。除此之外,池中此类线程的状态将是“等待”。当使用像Okhttp这样使用连接池进行网络操作的库时,也可以观察到这种现象。