【发布时间】:2012-06-15 06:05:41
【问题描述】:
在 android 2.3 之后,真正的 Android 团队在 Async 任务中做了哪些改变。当我执行以下代码时,我在 Android 2.3 和 3.0 中都得到了相同的结果。
package com.sample.asynctask;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
public class AsyncTaskTestActivity extends Activity {
private static final String TAG = "AsyncTaskTestActivity";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//ExecutorService executorService = Executors.newFixedThreadPool(1);
for (int i = 1; i <= 20; i++) {
TestTask testTask = new TestTask(i);
testTask.execute();
}
}
private static class TestTask extends AsyncTask<Void, Integer, Void> {
int i;
public TestTask(int i) {
Log.i(TAG, "Constructor for " + i);
this.i = i;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
Log.i(TAG, "onPreExecute for " + i);
}
@Override
protected Void doInBackground(Void... params) {
Log.i(TAG, i + " Thread goes to sleep");
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i(TAG, i + " Thread wakes up");
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Log.i(TAG, "onPostExecute for " + i);
}
}
}
我在 Gingerbread 中的假设:一次在一个线程池中执行 5 个异步任务。 我在 Honeycomb 中的假设:一次在一个线程池中执行 1 个异步任务。与并发执行完全一样。
但是,Gingerbread 和 Honeycomb 都同时执行 5 个异步任务。
当异步任务的数量增加到 140 时,我没有得到 java.util.concurrent.RejectedExecutionException 。
我的假设是否正确?里面到底发生了什么?
【问题讨论】:
标签: java android multithreading android-asynctask threadpool