- 1、本文档共32页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深入探讨Android异步精髓Handler
前言
众所周知,Android的UI是在其主线程中进行刷新的,所以Google建议开发人员切勿在主线程中进行耗时的操作否则很容易导致应用程序无响应(ANR)。鉴于此几乎接近硬性的要求,我们常把耗时的操作(比如网络请求)置于子线程中进行;但是子线程不能直接访问UI。
至此,这个矛盾就凸显出来了:
主线程可以刷新UI,但不能执行耗时操作
子线程可以执行耗时操作 ,但是不能直接刷新UI
嗯哼,那有没有一个东西可以调和并化解这个矛盾呢?当然是有的,Google采用Handler把主线程和子线程精巧地联系起来——子线程中进行耗时的业务逻辑,然后利用Handler通知主线程刷新UI。除此以外,还有别的方式可以实现类似的操作么?答案是肯定的,我们也可以利用AsyncTask或者IntentService进行异步的操作。这两者又是怎么做到的呢?其实,在AsyncTask和IntentService的内部亦使用了Handler实现其主要功能。抛开这两者不谈,当我们打开Android源码的时候也随处可见Handler的身影。所以,Handler是Android异步操作的核心和精髓,它在众多领域发挥着极其重要甚至是不可替代的作用。
在此,对Handler的工作原理和实现机制进行系统的梳理。
ThreadLocal简介及其使用
对于线程Thread大家都挺熟悉的了,但是对于ThreadLocal可能就要陌生许多了。虽然我们对于它不太了解,但是它早在JDK1.2版本中就已问世并且被广泛的使用,比如Hibernate,EventBus,Handler都运用了ThreadLocal进行线程相关的操作。如果单纯地从ThreadLocal这个名字来看,它带着浓浓的“本地线程”的味道; 然而,喝一口之后才发现根本就不是这个味儿。其实,ThreadLocal并不是用来操作什么本地线程而是用于实现不同线程的数据副本。当使用ThreadLocal维护变量时,它会为每个使用该变量的线程提供独立的变量副本;每一个线程都可以独立地改变自己的副本并且不会影响其它线程所持有的对应的副本。所以,ThreadLocal的实际作用并不与它的名字所暗含的意义相吻合,或许改称为ThreadLocalVariable(线程本地变量)会更合适一些。
接下来,我们通过一个实例来瞅瞅ThreadLocal的使用方式
/**
* 原创作者:
* 谷哥的小弟
*
* 博客地址:
* /lfdfhl
*/
private void testThreadLocal(){
mThreadLocal.set(东京热);
new HotThread1().start();
new HotThread2().start();
hot3=mThreadLocal.get();
try{
Thread.sleep(1000*4);
Log.i(TAG,HotThread1获取到的变量值: +hot1);
Log.i(TAG,HotThread2获取到的变量值: +hot2);
Log.i(TAG,MainThread获取到的变量值: +hot3);
}catch (Exception e){
}
}
private class HotThread1 extends Thread{
@Override
public void run() {
super.run();
mThreadLocal.set(北京热);
hot1=mThreadLocal.get();
}
}
private class HotThread2 extends Thread{
@Override
public void run() {
super.run();
mThreadLocal.set(南京热);
hot2=mThreadLocal.get();
}
}
查看输出结果:
HotThread1获取到的变量值: 北京热?HotThread2获取到的变量值: 南京热?MainThread获取到的变量值: 东京热
在这段代
文档评论(0)