注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Android开发之四异步任务和多线程的关联  

2014-11-06 22:26:09|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android开发之四异步任务和多线程的关联

Andorid的开发中,有时候儿会遇到这样和那样的问题,其中比较典型的一种就是在操作界面的时候儿,要做一个比较费时较长的工作。这个如果在C++等其它语言中,直接启动一个线程在后台干活儿就可以了。

同样,在Android中也是如此,但是在这里又有两个选择,是启动一个线程呢还是启用一个异步任务。如果这个操作时间较长的动作需要和UI主线程进行交互又该如何呢?

如果在Andorid的早期,不用多想,开一个Thread再加上Handler,让后台线程和UI主线程互相通信(http://blog.csdn.net/mylzc/article/details/6736988),但是这样一来,一个是编程的复杂度增加,另外程序并不能很好的进行扩展和解耦。从JDK1.5则提供了一个异步任务(顺道说一下,在C#,包括新的C++11也都提供了类似的机制)。

换句话说,如果想简单的达到后台线程与UI主线程之间进行通信,特别是定时和UI界面进行交互的话,异步任务是首先提倡使用的。当然,异步任务本质也是一个线程实现的,特别最新的提供的executeOnExecutor来替代execute这个函数。在不同的Android平台上,execute这个函数执行时引起的现象是不同的。

SDK3.0以前,这个是自动绑定一个线程池,默认5个,最大128个,同样执行一个异步任务,这些任务间是并发完成的。但是在3.0之后改成按顺序执行了。 那怎么样才能并发执行呢?也就是executeOnExecutor这个函数,这个函数内部的参数设置又提供了AsyncTask.SERIAL_EXECUTOR AsyncTask.THREAD_POOL_EXECUTOR,前是如同execute一般,后者是真正的并发执行。

相应的Java提供了四种线程池类型来供编程者使用:

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

话再转回到异步和线程,就是一句话,一个可以直接操作UI,一个不可以。

如果Thread想操作UI,就得用handler.所以该用简单的方法还是要用简单的方法。这个看大家的好恶了。

  评论这张
 
阅读(375)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017