android 基础 Handler

来源:互联网 发布:南京市软件定制开发 编辑:程序博客网 时间:2024/06/05 11:51

作用:

       当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,    或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了.,来解决这个复杂的问题 ,    由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。以我初学者的经验,这个东东貌似没多大用处哦! 完全可以另外开启一个线程来做这些事情。而且,一定程度上,还要好一些!


一个handler允许你发送和处理一个message对象和与之关联的Runnabel对象队列。每一个handler就是一个线程(thread)以及与之对应的线程消息队列。当你创建一个新的handler时,它被绑定到已经创建的主线程中,它将在出队时被执行。

有两个主要用途:1.将在未来要被执行的消息和runnables加入到队列中;2.将一个action入队,使其与当前进程异步执行。

通过以下方法进行加入消息:

post(Runnable)  //将一个Runnable入队

postAtTime(Runnable,long)//入队

postDelayed(Runnable,long)//入队  延时多少毫秒执行

post版本的方法允许你通过message来called 那些已经入队的Runnable对象


sendEmptyMessage(int)//发送一个没有消息的消息?仅仅传递一个

sendMessage(Message)//发送一个消息

sendMessageAtTime(Message,long)

sendMessageDelayed(MessageDelayed(Message,long)

sendMessage系列方法允许你入队一个包含可被Handler的handleMessage(Message)执行的绑定数据的Message



removeCallbacks(Runnable r) //移除消息队列中的r



其实Handler是与主线程一起执行的,java中线程使用Start()方法启动线程,而handler不使用Start()方法,而是直接执行run()方法。


使用方法:

简单的例子

Handler handler = new Handler();  //创建Handler实例

handler.post(Runnable);//将线程入队

handler.removeCallbacks(Runnabel)//  



如何实现真正的异步呢?新启动一个线程吗?


HandleThread ht = new HandleThread();   
class MyHandle extends Handler {
public MyHandler(Looper looper){
    super(looper);
}
public void handleMessage(Message msg){//可获得队列中的msg
...
}
}
ht.start();
MyHandle myhandle = new MyHandle(ht.getLooper());



----------------------------------------------------------------------------------------

关于消息传递

Message msg=myhandler.obtainMessage();

发送消息

msg有两个int 型的参数arg1,arg2

msg同样可以有obj对象引用型参数

msg还有setData()传入Bundle对象

Bundle是一种特殊的Map,键为String型,值为任意类型


依据相应的putObj();方法传入参数,

在handleMessage(Message msg){}中使用

msg.arg1

msg.obj

msg.getData()

获取数据

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 柯基耳朵不立怎么办 宝宝一惊一乍睡觉不踏实怎么办 新婴儿睡觉不踏实怎么办 耳朵里面疼肿了怎么办 生出来的孩子是畸形怎么办 二胎生了缺陷儿怎么办 扣完肚脐眼后疼怎么办 刚出生的婴儿屁股红怎么办 狗狗耳朵流血了怎么办 狗狗不让掏耳朵怎么办 下巴总是反复长脓包怎么办 不胖但有双下巴怎么办 早上起床眼肿了怎么办 小孩鼻梁很塌的怎么办 17岁鼻子是塌的,怎么办 鼻子又塌又翘怎么办 戴眼镜鼻子塌了怎么办 耳朵里长了粉刺怎么办 耳洞太大了怎么办变小 天生嘴唇厚又大怎么办 上嘴唇太厚怎么办还翘 20岁欠债5万怎么办 脑袋撞了个包怎么办 交通事故对方全责但不赔偿怎么办 人格分列症的症状怎么办 子宫肌瘤月经量多怎么办 卵泡长得太慢怎么办 后期卵泡长得慢怎么办 促排卵泡长得慢怎么办 子宫内膜薄要怎么办啊 hcg值正常孕酮低怎么办 20号染色体三体怎么办 14号染色体三体怎么办 怀孕七个月不想要了怎么办 胎儿性染色体45x怎么办 16号染色体偏多怎么办 大拇指又短又宽怎么办 削山药皮皮肤痒怎么办 脊柱侧弯20度怎么办 27岁脊柱侧弯怎么办 右侧侧脑室增宽怎么办