当我第一次看到AsyncTask的调用代码时候,我第一感就有个疑问。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
Log.v("AsyncTask", "doInBackground");
return "hello";
}
@Override
protected void onPostExecute(String result)
{
Log.v("AsyncTask", result);
}
};
task.execute();
}
task对象的生命周期。这个例子里面task是在onCreate函数里面创建的,那么等onCreate函数跑完了,task对象的生命周期是不是结束了呢?
1. task变量本身是在调用线程栈上面创建出来的,如果32bit的话,那么就是4个字节的一个变量。这个变量在onCreate执行完后,肯定被弹出栈,所以task变量本身死亡了,这是肯定的。
2. task指向的AsyncTask对象,AsyncTask对象是在堆里面被创建的,那么当task变量本身死亡了,堆上的内存块是不是也被收回了呢?根据JAVA的定义,堆上面的内存如果没有一个引用指向它,那么将被当作GC的回收对象。
那么AsyncTask这个例子,到底堆上的内存会不会被收回呢?具体就看Asynctask的实现了。
本文使用的是Android-21
AsyncTask构造函数
先看看构造函数:
public AsyncTask() {
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
//noinspection unchecked
return postResult(doInBackground(mParams));
}
};
mFuture = new FutureTask<Result>(mWorker) {
@Override
protected void done() {
try {
postResultI