AsyncTask在Android中是一个非常重要的类,其作用是在framework层实现了一个异步线程用来执行耗时的操作,Android中要求所有的UI操作都需要在主线程中进行,如果在非UI线程中操作UI会报异常,但往往存在要在非UI线程更新UI元素的场景,为了满足该需求通过AsyncTask能使Android开发者教容易的完成该需求的开发,通过重写doInBackground和onPostExecute方法来实现该需求,一般会在doInBackground方法执行耗时的操作,执行结束之后由onPostExecute方法来更新UI,也就是说doInBackground实在异步线程中执行的而onPostExecute是在主线程中执行的,但是如果一个进程中有多处使用AsyncTask并且,先执行的AsyncTask耗时较长的话就会导致后执行的AsyncTask被阻塞,Demo如下:
测试代码:
package com.android.example;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
public class AsycTaskDemoActivity extends Activity {
private static final String LOG_TAG = "AsycTaskDemoActivity";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(LOG_TAG, "===========>>onCreate");
setContentView(R.layout.main);
Void[] params = new Void[]{null,null,null};
Log.d(LOG_TAG, "===========>>AsyncTaskTestA begin");
new AsyncTaskTestA().execute(params);
Log.d(LOG_TAG, "===========>>AsyncTaskTestA end");
Log.d(LOG_TAG, "===========>>AsyncTaskTestB begin");
new AsyncTaskTestB().execute(params);
Log.d(LOG_TAG, "===========>>AsyncTaskTestB end");
}
private class AsyncTaskTestA extends AsyncTask<Void, Void, Void> {
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.d(LOG_TAG, "===========>>AsyncTaskTestA onPostExecute");
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(LOG_TAG, "===========>>AsyncTaskTestA onPreExecute");
}
@Override
protected Void doInBackground(Void... params) {
Log.d(LOG_TAG, "===========>>AsyncTaskTestA doInBackground");
int temp = 0;
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
temp++;
Log.d(LOG_TAG, "===========>>temp = " + temp);
if (temp == 5) {
return null;
}
}
}
}
private class AsyncTaskTestB extends AsyncTask<Void, Void, Void> {
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.d(LOG_TAG, "===========>>AsyncTaskTestB onPostExecute");
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(LOG_TAG, "===========>>AsyncTaskTestB onPreExecute");
}
@Override
protected Void doInBackground(Void... params) {
Log.d(LOG_TAG, "===========>>AsyncTaskTestB doInBackground");
int temp = 0;
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
temp++;
Log.d(LOG_TAG, "===========>>temp = " + temp);
if (temp == 5) {
return null;
}
}
}
}
}
测试结果:
03-27 17:45:28.129 D/AsycTaskDemoActivity( 5222): ===========>>onCreate
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA begin
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA onPreExecute
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA end
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB begin
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB onPreExecute
03-27 17:45:28.339 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB end
03-27 17:45:28.349 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA doInBackground
03-27 17:45:29.369 D/AsycTaskDemoActivity( 5222): ===========>>temp = 1
03-27 17:45:30.379 D/AsycTaskDemoActivity( 5222): ===========>>temp = 2
03-27 17:45:31.389 D/AsycTaskDemoActivity( 5222): ===========>>temp = 3
03-27 17:45:32.399 D/AsycTaskDemoActivity( 5222): ===========>>temp = 4
03-27 17:45:33.409 D/AsycTaskDemoActivity( 5222): ===========>>temp = 5
03-27 17:45:33.409 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestA onPostExecute
03-27 17:45:33.409 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB doInBackground
03-27 17:45:34.429 D/AsycTaskDemoActivity( 5222): ===========>>temp = 1
03-27 17:45:35.439 D/AsycTaskDemoActivity( 5222): ===========>>temp = 2
03-27 17:45:36.449 D/AsycTaskDemoActivity( 5222): ===========>>temp = 3
03-27 17:45:37.459 D/AsycTaskDemoActivity( 5222): ===========>>temp = 4
03-27 17:45:38.469 D/AsycTaskDemoActivity( 5222): ===========>>temp = 5
03-27 17:45:38.469 D/AsycTaskDemoActivity( 5222): ===========>>AsyncTaskTestB onPostExecute
从执行结果来看同一进程多处使用AsyncTask,先执行的AsyncTask会阻塞后边AsyncTask的执行,查看framework代码发现一个进程中的多个AsyncTask使用队列来进行管理的,所以如果先执行的AsyncTask耗时较长的话阻塞后边AsyncTask的执行。