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 启动一个工作线程接收处理消息.

===============================================









**

0 0
原创粉丝点击