当我在DDMS中使用AsyncTasks检查时,线程在onPostExecute()方法之后作为等待线程保留在内存中,这是正常的吗?这是一个简化的Activity,它可以重现我的问题:
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"); } }
}
解决方法
AsyncTask使用“线程池”技术.您启动的每个AsyncTask都会进入队列;在“池”中有一些空闲线程(或者根据需要创建它们,直到某个限制)等待任务.池中的空闲线程获取AsyncTask并执行它,然后返回池.然后重复该过程,直到队列中不再有任务为止.
这种方法有两个重要特征:
>每次创建一个线程都没有开销
>在大量任务的情况下,系统性能优雅地降级:大多数任务将在队列中等待,其中只有少数将会
一次执行;最终所有人都会被处决.
否则,如果为每个任务启动了单独的线程,则
系统可能会耗尽内存或线程,或任务将耗尽
永远完成.
您在AsyncTask完成后在DDMS中看到的线程是池中的空闲线程.