Android Gingerbread 之后 Async Task 到底发生了什么变化?

2023-12-12

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(使用前将#替换为@)

Android Gingerbread 之后 Async Task 到底发生了什么变化? 的相关文章

随机推荐

  • bootstrap:从 show.bs.modal 事件中抑制模态

    是否可以告诉 bootstrapNOT显示模式 通过返回false从内部到框架show bs modal event EDIT 使用 stopPropagation 或简单地disable按钮不是我想要的 我想处理逻辑inside show
  • 在插入查询中动态选择列名

    收到错误列名 ColumnNames 无效 在最后一行 插入子句 知道为什么吗 Declare ColumnNames varchar 2000 Declare OrderId int set OrderId 110077 select C
  • Android studio logcat 窗口日志级别过滤器丢失

    我的打印屏幕 我不知道如何解决它 即使我尝试过解决这些问题 类似问题1 类似问题2我的android studio版本是2021 3 1 这就是New Logcat 更新 海豚 如果你想放置级别过滤器那么你只需要写level error l
  • 以编程方式设置 Android IP、DNS、GATEWAY 设置

    如何从 android java 设置 wifi ip 地址 dns 地址 网关 即以编程方式设置 我没有找到任何能够存储这些值的方法 您可以通过编程方式更改系统设置 首先 您需要在 AndroidManifest xml 中请求 WRIT
  • 捕获 iframe 的屏幕截图 - html2canvas 不起作用

    我有以下 iframe 我只是想捕获 iframe 内容的屏幕截图 我已经尝试过 html2canvas 但它似乎不起作用 我尝试过将 iframe 放入 div 中 但没有任何乐趣 我见过使用 php 实现此目的的各种方法 但似乎没有什么
  • 用多字符字符串替换字符

    我正在尝试替换德语和荷兰语变音符号 例如 or 它们应该写成ae代替 所以我不能简单地将一个字符翻译成另一个字符 有没有更优雅的方法来做到这一点 实际上它看起来像这样 尚未完成 SELECT addr REPLACE REPLACE add
  • Android:如何获取文件的创建日期?

    这是我的代码 File TempFiles new File Tempfilepath if TempFiles exists String child TempFiles list for int i 0 i lt child lengt
  • git分支可以用数字列出吗?

    我想知道是否有人构建了一个脚本或有办法列出带有数字的 git 分支 以便代替这个 最好在 bash 中 feature myusername ID 1111 my branch name feature myusername ID 2222
  • django:控制json序列化

    有没有办法在django中控制json序列化 下面的简单代码将返回 json 中的序列化对象 co Collection objects all c serializers serialize json co json 将类似于以下内容 p
  • Git 中的子模块、子树或其他依赖项?

    我有一个较大的项目 其中有很多模块 库及其各自的存储库 这些模块中的大多数是其他模块的依赖项 而不是项目的依赖项 现在已经到了主项目有多个子项目并且许多模块被共享的地步 有些依赖关系的深度超过 3 4 层 我读过可以在项目内部更新 拉取子模
  • 调用 async fns 时创建值流?

    我不知道如何提供Stream我在哪里await异步函数来获取流值所需的数据 我尝试过实施Stream直接使用特质 但我遇到了问题 因为我想使用异步的东西 比如awaiting 编译器不希望我调用异步函数 我认为我缺少一些关于目标的背景知识S
  • 使用 Apache (.htaccess) 将 WWW 转换为非 WWW URL(删除 WWW)

    我必须将我的网站从https www example com to https website com SSL已正确安装在我的服务器上 我在用Apache并且必须使用来做到这一点Apache 任何一个httpd conf ssl conf
  • 如何使用Python的pip下载并保存包的压缩文件?

    如果我想使用pip命令下载包 及其依赖项 但是keep下载的所有压缩文件 例如 django socialregistration tar gz 有办法做到这一点吗 我尝试过各种命令行选项 但它似乎总是解压并deletezipfile 或者
  • cocoapods - “pod 安装”需要很长时间

    我试图用以下命令更新现有的 Podpod install命令 但需要永远运行 详细模式显示它卡在下一行 永远 更新规范存储库master usr bin git pull no rebase no commit 卡住后没有网络活动 我遇到了
  • AppWidgetProvider问题

    我有一个 AppWidgetProvider 当小部件首次添加到主屏幕时 我需要进行一些初始化 据我所知 执行此操作的位置是在 onEnabled Context context 方法中 我的问题是这个方法永远不会被调用 据我在 logca
  • C++ 库包含

    我对 C 比较陌生 第一次需要使用库 我希望有人能够向我展示如何正确地 链接到 包含 该库 我想使用的库是 ID3 v3 8 8 可以在这里找到 http id3lib sourceforge net 我已经下载了 Windows 二进制文
  • Java SystemV 时区和 JodaTime

    我正在使用 Joda Time 在 Java 应用程序中处理时区 我在尝试从 java 时区的 id 构建 DateTimeZone Joda Time 对象时遇到问题 乔达扔出一个 java lang IllegalArgumentExc
  • 将 UTC 日期时间全局转换为用户指定的本地日期时间

    我将所有 DateTime 字段存储为 UTC 时间 当用户请求网页时 我想采用他的首选本地时区 而不是服务器计算机的本地时区 并自动将所有 Web 表单中的所有日期时间字段显示为本地日期 当然 我可以在每种表单中的每个 DateTime
  • 具有特定产品标签的 WooCommerce 产品的批量动态定价

    我正在尝试为所有具有标签的产品添加动态折扣 批量折扣 我希望如果客户购买例如 就会发生折扣 5 个带有标签的相似或不同产品 我正在与this代码 和this回答 这就是我所拥有的 add action woocommerce before
  • Android Gingerbread 之后 Async Task 到底发生了什么变化?

    Android 2 3 之后 Android 团队在异步任务中真正做了哪些改变 当我执行以下代码时 我在 Android 2 3 和 3 0 中得到相同的结果 package com sample asynctask import andr