Android学习笔记之Handler
来源:互联网 发布:什么软件监控温度 编辑:程序博客网 时间:2024/05/16 11:25
今天在学习Android时遇到了Handler。在Android的多线程操作时不要阻塞ui线程,不要在ui线程外访问Android UI包。这时需要用到Handler,它运行在主线程中,通过接收子线程的消息来配合主线程更新UI。
下面是一个方便理解的例子:
模拟一个下载过程:
如果直接在子线程中改变UI(download为下载按钮触发事件):
public void download(View view){ //使用线程模拟下载操作 textView.setText("正在下载中...."); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } textView.setText("下载完毕"); } }).start(); }这样做会报错,这时我们就需要用到Handler,使用Handler在子线程中发出信号,当主线程收到信号后在改变UI:
private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case (10): textView.setText("正在下载中....") ; break; case (100): textView.setText("下载完毕"); break; } } }; public void download(View view){ //使用线程模拟下载操作 //textView.setText("正在下载中...."); handler.sendEmptyMessage(10);//发送一个空消息.相当于一个标记 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // textView.setText("下载完毕"); handler.sendEmptyMessage(100);//发送一个空消息.相当于一个标记 } }).start(); }
Handler实现原理:
1.Message对象,表示要传递的消息,使用链表创建消息池,避免大量创建消息对象
2.MessageQueue对象,存放消息对象的消息列,先进先出
3.Looper:管理当前消息队列,取出Message对象,传入handlerMessage方法
4.Handler对象负责把Message对象push到MessageQueue中以及接受Loop取出的消息
Android启动程序时会在UI线程创建一个MessageQueue
应注意,在使用handler时有时会出现内存泄漏问题。
0 0
- android学习笔记之Handler
- Android学习笔记之Handler
- Android学习笔记之Handler(一)
- android学习笔记之handler(1)
- android学习笔记之handler(2)
- android学习笔记之handler初接触!
- Android 学习笔记 二十二 之Handler
- Android学习笔记之Handler内存泄露
- android学习笔记之handler简单实用
- Android学习笔记040之Handler
- Android学习笔记四十之Handler
- Android Handler学习笔记
- android handler学习笔记
- Android Handler学习笔记
- Android学习笔记----Handler
- android Handler 学习笔记
- android Handler学习笔记
- Android笔记之handler
- UINavigationBar 透明颜色后下方还有一个1像素的黑线
- Git 命令行汇总
- acm反馈信息
- struts2的内置拦截器
- Linux中fork()函数详解
- Android学习笔记之Handler
- Python最常用的正则表达式
- Redis和Memcached的区别
- MySQL的读写分离(二)
- 全志A33增加uart接收 汇编层次
- Struts的Action中获取域对象API
- 自动连接上次连接的蓝牙设备(Android开发)
- JavaScript的OO思想(一)
- 解决eclipse创建maven项目报错!Could not resolve archetype org.apache.maven.archetypes:maven-archetype-webapp: