Android开发之使用Handler刷新UI控件
2013-11-11 13:04 y-z-f 阅读(17557) 评论(1) 编辑 收藏 举报一、为什么必须使用Handler
-
线程安全问题
这个问题要理解的话很容易,如果没有这个约束,那么同时有两个线程对一个UI控件进行调整,
那么控件自然就没法正常的工作,而为了解决这种二义性(就是一个东西同时被多个使用者使用,
从而无法判断按哪个使用者来调整)。而Handler永远都是在UI主线程,这就意味着对一个控件的修
改永远只会有一个线程,不会存在多个线程同时修改一个控件。 -
统一管理
通过Handler可以统一进行对UI的管理,因为Handler采用消息处理的机制。简单理解就是另
一个线程发送一个编号给消息所在的线程,那么该线程的消息处理程序就会收到该消息并进行处理,
而消息采用int类型,所以int能够表示多少种数字就以为着有多少消息可以给你使用(因为存在系统
的消息,所以可能有一部分被系统的消息占有,而不能使用)。
二、Handler介绍
-
handleMessage(Message msg)
需要重写的方法,该方法为处理消息的核心函数。 -
sendEmptyMessage(int what)
发送指定的消息,该方法为仅仅只是传递一个int值来表示发送的消息类型。
三、重写handleMessage(Message msg)
1 Handler handler = new Handler(){ 2 @Override 3 public void handleMessage(Message msg){ 4 //获得通过handler.sendEmptyMessage发送的消息编码 5 int what = msg.what; 6 /* 处理代码 */ 7 } 8 }
四、使用handler发送消息
1 handler.sendEmptyMessage(0x101);
五、实例
- 新建一个线程来给主线程发送消息
1 public class MainActivity extends Activity{ 2 private static final int send_msg_code = 0x101; 3 4 Handler handler = new Handler(){ 5 @Override 6 public void handleMessage(Message msg){ 7 int what = msg.what; 8 if(what == send_msg_code){ 9 Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show(); 10 } 11 } 12 } 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) 16 { 17 new Thread(new Runnable(){ 18 handler.sendEmptyMessage(send_msg_code); 19 }).start(); 20 } 21 }
六、扩展
-
post(Runnable r)
将r加入到消息队列中(其实就是利用UI主线程执行一段代码,这样可以随时在其他线程中调整控件) -
postDelayed(Runnabled r,long delayMillis)
将r加入到消息队列中,并在指定时间之后触发(单位为毫秒) -
removeMessages(int what)
取消消息的发送 -
sendMessages(Message msg)
通过Message发送消息(这样可以将数据包装进去,一起发送过去)
Xamarin.Android -> Xamarin.IOS -> 混合 -> Xamarin.Forms
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?