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并执行它,然后返回到池中。然后重复该过程直到队列中没有更多的任务。

这种方法有两个重要特点:

  1. 没有开销在巨大数量的任务系统性能的情况下,每次
  2. 创建线程降低优雅:大部分的任务将等待在队列中,一次只能执行其中的几个,即 ;最终他们都会被执行。 否则,如果为每个任务启动一个单独的线程,则系统可能会耗尽内存或线程,或者任务永远需要完成 。

您在AsyncTask完成后在DDMS中看到的线程是池中的空闲线程。

0

这里提供的答案都是正确的。除此之外,池中这些线程的状态将是“等待”。当使用Okhttp等网络操作使用连接池的库时,也可以观察到这种现象。

相关问题