gpt4 book ai didi

java - 在 Android Gingerbread 之后,Async Task 真正发生了什么变化?

转载 作者:搜寻专家 更新时间:2023-11-01 08:09:44 24 4
gpt4 key购买 nike

在android 2.3之后,Android团队在Async task方面真正做了哪些改变。当我执行以下代码时,我在 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 到底发生了什么变化?

查看 AsyncTask change history ,更具体地说,这个:

Mar 17, 2011 - AsyncTask now uses the poll executor for apps up through HC MR1 and t…

当异步任务的数量增加到 140 时,我没有得到 java.util.concurrent.RejectedExecutionException。

这是任务总数和每个任务执行时间的一个因素,在另一个世界中,任务总数是 140(比 128 大),然而,线程池在任何给定时间分配的线程总数时间小于 128,换句话说,在您的情况下总是有一些空闲线程(由于最后一个任务完成并释放资源)可用。您可以尝试增加每个任务的执行时间,例如 Thread.sleep(10000),这可能会给您带来 RejectedExecutionException。

关于java - 在 Android Gingerbread 之后,Async Task 真正发生了什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10995281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com