`

android2.3及4.0 AnsycTask区别与比较

 
阅读更多

 

1.问题由来:

    1.在SDK2.3环境下,开发下载模块时,核心下载线程通过ansyncTask,当下载任务为>=5个时,应用中的其他用ansyncTask实现的操作都被阻塞而没有被执行,下载也最多只有五个;

    2.在SDK4.0环境下,下载模块中,只能有一个下载任务下载。当有一个下载任务,再添加一个下载任务时,不能添加,不能同能下载;

   

2.问题原因分析:

       1.针对问题一:

 

        1)原因:

    因为下载中的后台非主线程实现类是android AsyncTask。查看其源代码,发现其实质是用到了java的线程池:

    privatestaticfinalintCORE_POOL_SIZE = 5; //表明线程池大小为5,意思是同时最多只允许5个线程调度和执行。

    这样,当其他的操作用到AsyncTask时,这些操作将被阻塞,因此才出现了上面的问题

 

    2)解决方案:

    1)不使用android的ansyncTask,直接使用java的线程调度API

    2)修改最大同时下载任务由5个改成3个。这也是为什么现在的android的相关app应用最大下载任务数基本都是2或者3个。因为现在app下载基本都是用的AnsyncTask实现,最大下载任务数基本都是2或者3个。

 

    2.对与问题二 :

   1)原因:

    1. Android2.3以前的版本,也即SDK/API 10和以前的版本

    内部的线程池限制是5个,也就是说同时只能有5个线程运行,超过的线程只能等待,等待前面的线程某个执行完了才被调度和运行。换句话说,如果一个进程中的AsyncTask实例个数超过5个,那么假如前5个都运行很长时间的话,那么第6个只能等待机会了。这是AsyncTask的一个限制,而且对于2.3以前的版本无法解决。如果你的应用需要大量的后台线程去执行任务,那么你只能放弃使用AsyncTask,自己创建线程池来管理Thread,或者干脆不用线程池直接使用Thread也无妨。不得不说,虽然AsyncTaskThread使用起来比较方便,但是它最多只能同时运行5个线程,这也大大局限了它的实力,你必须要小心的设计你的应用,错开使用AsyncTask的时间,尽力做到分时,或者保证数量不会大于5

    Android 3.0开始对AsyncTaskAPI做出了一些调整:

    #execute()提交的任务,按先后顺序每次只运行一个也就是说它是按提交的次序,每次只启动一个线程执行一个任务,完成之后再执行第二个任务,也就是相当于只有一个后台线程在执行所提交的任务(Executors.newSingleThreadPool())

    2)解决方案

    1.新增了接口#executeOnExecutor()

    这个接口允许开发者提供自定义的线程池来运行和调度Thread,如果你想让所有的任务都能并发同时运行,那就创建一个没有限制的线程池(Executors.newCachedThreadPool()),并提供给AsyncTask。这样这个AsyncTask实例就有了自己的线程池而不必使用AsyncTask默认的。

2.新增了二个预定义的线程池SERIAL_EXECUTORTHREAD_POOL_EXECUTOR

 

其实THREAD_POOL_EXECUTOR并不是新增的,之前的就有,只不过之前(Android 2.3)它是AsyncTask私有的,未公开而已。THREAD_POOL_EXECUTOR是一个corePoolSize5的线程池,也就是说最多只有5个线程同时运行,超过5个的就要等待。所以如果使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)就跟2.3版本的AsyncTask.execute()效果是一样的

分享到:
评论

相关推荐

    android2.3 仿 4.0 launcher

    在Android 2.3系统上使用这个启动器,用户可以获得与Android 4.0相似的体验,尽管它不包含小部件(Widget)支持。 Android 4.0(Ice Cream Sandwich)是Google发布的一个重要更新,引入了许多视觉和交互性的改进,...

    Android4.0 与 android2.3 差异

    【Android4.0与android2.3差异】 Android操作系统自发布以来,一直在不断地进行更新和优化,以适应用户的需求和移动设备技术的进步。Android 4.0(Ice Cream Sandwich,简称ICS)作为对2.3(Gingerbread)的一个...

    android2.3 文字转语音 4.0不可用

    在您提供的信息中,标题提到的是"android2.3 文字转语音 4.0不可用",这可能意味着在Android 2.3版本中可用的文字转语音服务在Android 4.0版本上遇到了问题。 Android 2.3(Gingerbread)时代的TTS服务相对基础,但...

    flash for android2.3

    在本文中,我们将深入探讨Flash Player的历史、它在Android设备上的应用以及与Android 2.3系统的关系。 Flash Player是由Adobe公司开发的一款多媒体软件,用于在Web上展示动画、视频和交互式内容。在20世纪90年代末...

    Android2.3实现Android4.0风格EditText的方法

    本文实例讲述了Android2.3实现Android4.0风格EditText的方法。分享给大家供大家参考,具体如下: 效果如下: 思路:在源码里找到4.0风格的图片作为背景,xml文件定义点击时候边框变化 步骤: 1.在 D:\Android\...

    手机ROOT工具EROOT for 2.3/4.0/4.1/4.2

    "EROOT for 2.3/4.1/4.2" 是针对Android 2.3 Gingerbread、4.1 Jelly Bean以及4.2 Jelly Bean版本的手机开发的一款ROOT工具,它旨在解决不同品牌手机,如华为、三星、联想等设备的ROOT问题。在描述中提到,用户可能...

    Android2.3应用开发实战源代码

    《Android2.3应用开发实战源代码》是林城撰写的一本书,主要针对的是Android 2.3(Gingerbread)版本的应用程序开发。这本书通过实际案例的方式,深入浅出地介绍了如何在Android 2.3平台上构建和优化应用程序。在源...

    300*480 安卓2.3用仿4.0开机动画

    6. **兼容性问题**:由于Android 2.3和4.0之间的系统差异,直接将4.0的开机动画移植到2.3可能会遇到兼容性问题,例如渲染错误、性能降低或者动画不流畅。因此,需要对动画进行适当的调整和优化,确保在较低版本的...

    android sdk版本 4.0

    在本场景中,我们关注的是Android SDK的特定版本——4.0,也被称为Ice Cream Sandwich(冰淇淋三明治),其内部版本号为14。这个版本在Android的发展历程中占据着重要的位置,因为它引入了许多新特性、改进和用户...

    android2.3源码解读—stagefright框架

    《Android 2.3源码解读—Stagefright框架》 Android系统中,多媒体处理是一个至关重要的部分。在Android 2.3版本之前,OpenCORE是主要的多媒体框架,但其复杂的架构和维护成本促使Google引入了更为简洁的Stage...

    android 2.3 sdk android-2.3-sdk

    Android 2.3 SDK,又称为Gingerbread(姜饼),是Google针对其移动操作系统Android发布的一个重要版本。这个SDK(软件开发工具包)为开发者提供了构建、测试和调试针对Android 2.3系统应用所需的工具和技术文档。...

    android2.3 launcher分析三

    【Android 2.3 Launcher 分析】 Android 2.3 的 Launcher 是用户界面的核心部分,它作为设备的主要入口,提供用户访问应用程序、小部件和设置的界面。在深入分析之前,我们先了解一下 Launcher 的基本架构。 **...

    android2.3下s3c6410串口开发

    android2.3下三星6410串口开发总结,uboot裸机代码,android下jin层串口初始化、读、写函数

    android 2.3升级方法

    通过对Android 2.3升级方法的详细介绍,相信读者已经了解了从低版本升级到Android 2.3的基本流程及注意事项。虽然现在Android系统已经发展到了更高的版本,但对于一些老旧设备而言,升级到Android 2.3依然能够带来更...

    android Ble 蓝牙4.0 GATT 错误代码

    "Android Ble 蓝牙4.0 GATT 错误代码详解" Android Ble 蓝牙4.0 GATT 错误代码是指在 Android 蓝牙4.0 设备中使用 GATT(Generic Attribute Profile)协议时可能出现的错误代码。这些错误代码用于标识不同的错误...

    Android 2.3 源代码

    《Android 2.3源代码解析与开发指南》 Android 2.3,又被称为Gingerbread(姜饼),是Android操作系统的一个重要版本,它带来了许多性能优化和新功能,为开发者提供了更丰富的API和更好的用户体验。源代码的开放性...

    Android2.3蓝牙串口程序

    Android2.3通过蓝牙串口接收数据,并解析。

    Ubuntu平台下Android2.3源码下载编译全过程

    在Ubuntu平台上编译Android 2.3源码是一项复杂的过程,需要遵循一系列步骤。首先,确保你的系统满足必要的要求,即运行Ubuntu 10.04或更新版本,并且是64位系统。同时,安装Java Development Kit (JDK) 1.6或更高...

Global site tag (gtag.js) - Google Analytics