- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线程在Android开发中应用
线程在Android开发中应用
摘 要:Android中线程主要是用来处理一些耗时操作,防止UI线程阻塞,并进行异步处理以提高程序的效率的线程。在Android应用开发中,要时时考虑到用户的体验效果,因此对应用程序的执行效率要有很高的要求,这就使开发人员在Android开发中无可避免地使用线程。本文主要讨论Android应用开发中线程使用的意义、使用线程的方法、主线程和子线间的通信,以及介绍了Android SDK中提供的一些有关线程的工具类。
关键字:Android;主线程;子线程;消息
中图分类号: TP311.52 文献标识码:A DOI:10.3969/j.issn.1003-6970.2013.08.008
本文著录格式:[1]纪晓阳.线程在Android开发中的应用[J].软件,2013,34(8):24-26
0 前言
Android应用程序通常是运行在一个单独的线程(如:main)里。如果我们的应用程序所做的事情在主线程里占用了太长的时间的话,就会引发ANR(Application Not Responding)对话框,因为你的应用程序长期占用着主线程,而主线程一般是用来处理用户输入事件或者Intent广播。对于ANR的概念,在Android里,应用程序的响应性是由ActivityManager[1]和WindowManager[1]系统服务监视的当它监测到以下情况中任一个时:
a. 在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸);
b. BroadcastReceiver [2]在10秒内没有执行完毕。
Android就会针对特定的应用程序显示一个ANR对话框(如图1所示为一个转码应用Lame中出现的ANP)显示给用户。
所以为了避免我们的应用程序出现ANR,就要让运行在主线程里的任何方法都尽可能少做耗时操作,例如网络或数据库操作,或者高耗时的计算(如改变位图尺寸)等。这时,我们就可以开启子线程来处理这些耗时操作以避免出现ANR。同时应用程序也应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是开启子线程里做这些任务(因为BroadcastReceiver的生命周期短),如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service来处理这些耗时操作。本文是举例介绍用户输入事件无响应的问题事例,主要讨论Android 程序中线程间的通信以及Android SDK中一些使用到线程的类和方法。
1 如何创建线程
Java??供了线程类Thread来创建多线程的程序,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:
a. 需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;
b. 实现Runnalbe[2]接口,重载Runnalbe接口中的run()方法。
这两种方法的区别就是,一个是直接创建Thread对象,另外一个是需要implement了Runnable接口对象作为创建Thread对象的参数。Runnable其实我们称为线程任务。
所以为了避免图1中出现的错误,我们可以在主线程中开启一个线程来执行耗时操作(如转码方法converTarg(src,targ)),主要代码如下:
当我们开启一个子线程,在子线程中进行转码操作时,如果在转码执行过程中,用户需要与界面进行交互(如触摸手机屏幕),这时事例应用Lame就不会出现图1的ANR对话框,而是继续进行正常转码(如图2),因为我们的转码操作是在子线程中进行的,没有占用主线程。
2 线程和主线程之间的通信
Android线程与一般的Java多线程处理方式是不同的,其中重点是消息发送和计划任务,接受消息发送和计划任务的处理是目标线程,它是通过Looper[2]机制维护消息队列,如果应用中有包含更新UI处理,则要把更新UI的处理代码放置在目标线程中,这个时候还要保障更新UI的线程是主线程。
开启线程主要就是处理应用程序中的耗时操作,处理完了就要把处理后的结果返回给主线程,由主线程再做进一步处理(如更新界面数据)。为了解决类似的问题,Android设计了一个Message Queue(消息队列 ), 线程间可以通过该Message Queue并结合Handler[3]和Looper组件进行信息交换。
Message对象为线程间交流的信息,该对象内包含子线程处理后的数据。Handler对象是Message的主要处理者,负责Message的发送,Message
您可能关注的文档
最近下载
- 人工智能与大数据专项测试题有答案.doc
- DBJT50-091图集-增强型改性发泡水泥保温板建筑保温系统建筑构造.pdf
- 南京鼓楼区某校2023-2024五年级上册英语期中试卷.pdf VIP
- 2024年合肥滨湖时光产业投资集团本部及子公司招聘21人笔试模拟试题及答案解析.docx
- 人教部编版六年级上册语文选择题专项复习练习(100题后附答案).pdf VIP
- 电气自动化生涯人物访谈报告500字.docx
- 第五单元解决问题的策略(单元测试)-四年级上册数学苏教版.docx VIP
- 红外线治疗的操作流程.pptx VIP
- 贵州茅台的财务报表分析.pdf VIP
- 大气的组成与垂直分层...ppt VIP
文档评论(0)