Android 2.3 之后,Android 团队在异步任务中真正做了哪些改变。当我执行以下代码时,我在 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
.
我的假设是否正确?里面究竟发生了什么?
我的假设是否正确?
你的假设是正确的,嗯,有点正确。
里面究竟发生了什么?
里面默认的执行者android.os.AsyncTask:
... ...
private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;
... ...
已重置于android.app.ActivityThread:
... ...
// If the app is Honeycomb MR1 or earlier, switch its AsyncTask
// implementation to use the pool executor. Normally, we use the
// serialized executor as the default. This has to happen in the
// main thread so the main looper is set right.
if (data.appInfo.targetSdkVersion <= android.os.Build.VERSION_CODES.HONEYCOMB_MR1) {
AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
... ...
Android Gingerbread 之后 Async Task 到底发生了什么变化?
查看异步任务改变历史,更具体地说,这个:
2011 年 3 月 17 日 - AsyncTask 现在对 HC MR1 及以上的应用程序使用轮询执行器...
当异步任务的数量增加到 140 时,我没有收到 java.util.concurrent.RejectedExecutionException。
这是任务总数和每个任务的执行时间的因素,在另一个世界中,任务总数是 140(大于 128),但是,线程池在任何给定时间分配的线程总数会更小大于 128,换句话说,在您的情况下总是有一些空闲线程(由于最后一个任务完成并释放资源)可用。例如,您可以尝试增加每个任务的执行时间Thread.sleep(10000)
,这可能会给您带来 RejectedExecutionException。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)