ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:23.01KB ,
资源ID:20589545      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20589545.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(activity启动模式Word格式文档下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

activity启动模式Word格式文档下载.docx

1、以后遇到这样的异常抛出时就要知道怎么回事了!2.2 Message Queue在单线程模型下,为了解决类似的问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换。下面将对它们进行分别介绍:1. Message Message消息,理解为线程间交流的信息,处理数据后台线程需要更新UI,则发送Message内含一些数据给UI线程。2. Handler Handler处理者,是Message的主要处理者,负责Message的发送,Message内容的执行处理。后台线程就是通过传进来的Han

2、dler对象引用来sendMessage(Message)。而使用Handler,需要implement 该类的handleMessage(Message)方法,它是处理这些Message的操作内容,例如Update UI。通常需要子类化Handler来实现handleMessage方法。3. Message Queue Message Queue消息队列,用来存放通过Handler发布的消息,按照先进先出执行。每个message queue都会有一个对应的Handler。Handler会向message queue通过两种方法发送消息:sendMessage或post。这两种消息都会插在me

3、ssage queue队尾并按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过sendMessage发送的是一个message对象,会被Handler的handleMessage()函数处理;而通过post方法发送的是一个runnable对象,则会自己执行。4. Looper Looper是每条线程里的Message Queue的管家。Android没有Global的Message Queue,而Android会自动替主线程(UI线程)建立Message Queue,但在子线程里并没有建立Message Queue。所以调用Looper.getMainLooper()得到的主线

4、程的Looper不为NULL,但调用Looper.myLooper()得到当前线程的Looper就有可能为NULL。对于子线程使用Looper,API Doc提供了正确的使用方法:1. classLooperThreadextendsThread2. 3. publicHandlermHandler;4. 5. 6. 7. voidrun()8. 9. Looper.prepare();/创建本线程的Looper并创建一个MessageQueue10. 11. 12. 13. 14. mHandler=newHandler()15. 16. 17. handleMessage(Messagem

5、sg)18. 19. /processincomingmessageshere20. 21. 22. 23. ;24. 25. 26. 27. Looper.loop();/开始运行Looper,监听MessageQueue28. 29. 30. 31. 32. 这个Message机制的大概流程:1. 在Looper.loop()方法运行开始后,循环地按照接收顺序取出Message Queue里面的非NULL的Message。2. 一开始Message Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message Queue,该函数里

6、面设置了那个Message对象的target属性是当前的Handler对象。随后Looper取出了那个Message,则调用该Message的target指向的Hander的dispatchMessage函数对Message进行处理。在dispatchMessage方法里,如何处理Message则由用户指定,三个判断,优先级从高到低:1) Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;2) Handler里面的mCallback指向的一个实现了Callback接口的对象,由其handleMessage进行处理;3) 处理消息Handler

7、对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息。由此可见,我们实现的handleMessage方法是优先级最低的!3. Handler处理完该Message (update UI) 后,Looper则设置该Message为NULL,以便回收!在网上有很多文章讲述主线程和其他子线程如何交互,传送信息,最终谁来执行处理信息之类的,个人理解是最简单的方法判断Handler对象里面的Looper对象是属于哪条线程的,则由该线程来执行!1. 当Handler对象的构造函数的参数为空,则为当前所在线程的Looper;2.Looper.get

8、MainLooper()得到的是主线程的Looper对象,Looper.myLooper()得到的是当前线程的Looper对象。现在来看一个例子,模拟从网络获取数据,加载到ListView的过程:1. publicclassListProgressDemoListActivityOverrideonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.listprogress);13. 14. 15. (Button)findViewById(R.id.load_Ha

9、ndler).setOnClickListener(newView.OnClickListener()onClick(Viewview)datanull;ArrayList();adapter31. 33. showDialog(PROGRESS_DIALOG);34. 35. ProgressThread(handler,data).start();36. 37. 38. 39. );40. 41. 42. 43. 44. 45. 46. 47. protectedDialogonCreateDialog(intid)48. 49. switch(id)50. 51. casePROGRES

10、S_DIALOG:52. 53. returnProgressDialog.show(this,54. 55. Loading.Pleasewait.true);56. 57. 58. 59. default:60. 61. 62. 63. 64. 65. 66. 67. privateProgressThread68. 69. 70. 71. handler;72. 73. data;74. 75. 76. 77. ProgressThread(Handlerhandler,data)78. 79. this.handler80. 81. this.data82. 83. 84. 85. 8

11、6. 87. 88. 89. 90. 91. for(inti=0;i8;i+)92. 93. data.add(ListItem);/后台数据处理94. 95. try96. 97. Thread.sleep(100);98. 99. catch(InterruptedExceptione)100. 101. 102. 103. Messagemsghandler.obtainMessage();104. 105. BundlebBundle();106. 107. b.putInt(stateSTATE_ERROR);108. 109. msg.setData(b);110. 111. h

12、andler.sendMessage(msg);112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. STATE_FINISH);124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 此处甚至可以不需要设置Looper,因为Handler默认就使用当前线程的Looper138. 139. finalhandlerHandler(Looper.getMainLooper()140. 141. 142. 143. 144. / 处理Message,

13、更新ListView145. 146. intstatemsg.getData().getInt(147. 148. switch(state)149. 150. STATE_FINISH:151. 152. dismissDialog(PROGRESS_DIALOG);153. 154. Toast.makeText(getApplicationContext(),155. 156. 加载完成!157. 158. Toast.LENGTH_LONG)159. 160. .show();161. 162. 163. 164. ArrayAdapter(getApplicationContext

14、(),165. 166. android.R.layout.simple_list_item_1,167. 168. 169. 170. 171. 172. setListAdapter(adapter);173. 174. 175. 176. break;177. 178. 179. 180. STATE_ERROR:181. 182. 183. 184. 185. 186. 处理过程发生错误!187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206.

15、207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. adapter;225. 226. 227. 228. 229. 230. staticPROGRESS_DIALOG1;231. 232. STATE_FINISH233. 234. STATE_ERROR-1;235. 236. 237. 这个例子,我自己写完后觉得还是有点乱,要稍微整理才能看明白线程间交互的过程以及数据的前后变化。随后了解到AsyncTask类,相应修改后就很容易明白了!2.3 AsyncTaskAsyncTask版:1. (Button)findViewById(R.id.load_AsyncTask).setOnClickListener(new/显示ProgressDialog放到AsyncTask.onPreExecute()里/showDialog(PROGRESS_DIALOG);ProgressTask

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1