`

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服务相对基础,但...

    android 2.3 源代码

    android 2.3 源代码 android 2.3 源代码 android 2.3 源代码

    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平台上构建和优化应用程序。在源...

    android sdk版本 4.0

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

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

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

    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通过蓝牙串口接收数据,并解析。

    RDP 远程桌面 (Android 2.3+).apk

    RDP 远程桌面 (Android 2.3+).apk

Global site tag (gtag.js) - Google Analytics