27安卓线程

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

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













**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值