27安卓线程
来源:互联网 发布:数据挖掘案例分析 编辑:程序博客网 时间:2024/05/18 03:35
Android 单线程模型
======================================
*所有的界面显示,用户操作,组件的控制
必须在主线程中执行
Android 线程通信
============================
*在工作线程中(自己启动的线程)要更新界面显示
要向主线程发送消息(不能再自己的线程中tv.setText())要与主线程通信.
ANR
============================
*Application Not Responding
应用无响应
*主线程执行时,程序阻塞在一段代码当中
主线程无法更新界面显示,
也无法响应用户的操作
*用户在界面点击后,5秒无响应,就会弹出ANR Ctrl
=====================================
工作线程做ui更新操作时异常:
Only the original thread that created a view hierarchy can touch its views.
Handler
======================================
*向关联的Looper发送消息
Looper 在处理消息时,再回调Handler处理
创建实例
-------------------------------
1,持有当前线程的Looper
Handler handler=new Handler()
2,由重写的方法处理消息
Handler handler=new Handler()
{
重写handleMessage(Message msg)
}
3,Message.obtain()(静态方法创建),new Message()区别在于obtain可以获得之前创建过的消息(缓存中),而不新建对象,减少开销.提高性能.
Message.obtain(handler,1,2).sendToTarget(); == sendToTarget()内部实现handler.sendMessage(this)
不用调用handler.sendMessage(message) 直接点.
====================================
Handler 也有一个obtainMessage(....)可以直接创建一个message对象
-------------------------------------------------------------------------------------------------------
Message
============================
int what想干嘛
int art1自定义参数
int arg2自定义参数
Object obj 任意对象
方法
---------------------------------
setData(Bundle bundle)放键值对的数据
getData()
Bundle本质是哈希表
存放一组键值对数据
set Target(Handler handler)
getTarget() 访问关联的Handler对象
*发送消息
handler.sendMessate(msg)
handler.sendEmptyMessage(what)
handler.post(Runable)
msg.sendToTarget()//消息中包含一个Handler对象可以直接发送
*处理消息
1,在Message上外接一个Runable回调
2,在Handler上外接一个Callback回调
3,重写 handleMessage()
***主线程会维护一个messae(queue) looper不断处理.
工作线程调用handler.sendMessage 把消息放到queue中等待处理当处理到放入的message时毁掉handler的handlemessage方法(需要自己实现)
****4.0之后网络的连接必须在工作线程中
Looper处理消息
while(true)
{
Message msg=queue.next();
Handler h =msg.getTarget();//发送消息的Handler对象
h.dispatchMessage(msg)//将消息取出来发回handler处理
}
Handler.dispatchMessage(msg)解析
Handler.dispatchMessage(msg); if (msg.callback!=null){ msg.callback.run();}else{ if(this.callback!=null) { boolean b=this.callback.handleMessage(msg); if(!b)//如果是真就只执行这段代码,如果是假会执行handler里面的handleMessage { this.handleMessage(msg); } }else { this.handleMessage(msg); }}
*****
dispatchMessage(Message msg)
Looper处理消息时调用Handler的dispatchMessage方法
此方法内部逻辑:
1,存在msg的回调对象,执行回调对象不执行其它回调.
2,在Handler上存在回调对象,执行回调
2.1,该方法返回true结束
2.2,该方法返回false执行重写测handleMessage()
3,以上两个回调对象都不存在
直接执行重写的handleMessage().
=====================工作线程中通过Looper接受处理消息==================================
Looper.prepare();
创建消息队列
并创建Looper实例,
然后将Looper实例绑定到当前线程
handler=new Handler()//关联当前线程的handler
从当前线程获得Looper,Handler会持有该looper对象
Looper.loop();
进入死循环,
等待其他线程向当前线程发送消息
Looper
====================================
*会绑定到当前线程
*loop()执行一个死循环,从队列获取消息处理
looper.prepare()在当前线程中创建消息队列,并实例化一个新的looper对象
looper.loop()开始死循环轮回处理消息
looper.getMainLooper()获得主线程(UI 线程)Looper
looper.myLooper()获得当前线程Looper
myQueue()获得当前线程消息队列
setMessageLogging(Printer printer)//LogPrinter
HandlerThread t 启动一个工作线程接收处理消息.
===============================================
**
- 27安卓线程
- 安卓线程问题
- 安卓线程问题
- day28安卓线程
- 安卓之多线程
- 安卓终止线程
- 安卓线程状态
- 安卓中的线程
- 安卓中的线程
- 安卓 线程 和 线程池
- 安卓线程池和线程
- 安卓学习之多线程
- 安卓线程操作技术
- 安卓ui线程优先级
- 安卓之线程池
- 安卓之多线程下载
- 安卓 如何创建线程
- 安卓011线程&Handler
- 侧滑布局2
- Intent和PendingIntent的区别
- 杭电ACM----1091
- RAP web 接口管理工具
- webview加载百度
- 27安卓线程
- Android之存储目录
- 杭电ACM---1092
- MySQL学习总结
- 欢迎使用CSDN-markdown编辑器
- 百度检索定位
- 一周年
- post请求
- WIN7 X64下搭建masm DEBUG环境