非淡泊无以明志,非宁静无以致远。这篇文章主要讲述Android学习笔记(十三) Handler相关的知识,希望能为你提供帮助。
【Android学习笔记(十三) Handler】可用于解决上一则笔记所提到的WorkerThread无法修改UI控件的问题
一、Handler、Looper和MessageQueue的基本原理
文章图片
Handler把消息对象放到MessageQueue当中,而Looper负责在消息队列头部不断取出消息对象。取出的对象再交给Handler处理。
二、一个简单的Handler例子-先创建一个继承Handler的类,注意是导入android.os.Handler(非常重要)
class firstHandler extends Handler{}
-复写方法handleMessage(Message msg)
-创建Handler对象
handler = firstHandler()
-生成一个Message,并且给what成员变量赋值
Message msg = handler.obtainMessage();
msg.what = 2;
-将消息对象放置到消息队列中。
handler.sendMessage(msg);
-Looper将会从消息队列当中将消息对象取出;
-Looper将会找到与消息对象对应的Handler对接(每一个Message对象都有与之对应的Handler对象);
-Looper将会调用Handler对象的handleMessage(Message msg)方法,用于处理消息对象。
三、在主线程当中实现Handler的handleMessage()方法注:不管是在WorkerThread还是在MainThread中都可以发送消息,即:handler.sendMessage(Message msg)
1)在新建线程的run()中发送Message:
class NetworkThread extends Thread{ @Override public void run(){ String s = "模拟从网络中获取的数据"; Message msg = handler.obtainMessage(); msg.obj = s; handler.sendMessage(msg); } }
2)复写handleMessage()方法。因为这个方法是被主线程调用的,所可以更改UI。
class MyHandler extends Handler{ @Override public void handleMessage(Message msg){ tring s = (String)msg.obj; textView.setText(s); } }
四、主线程向WorkerThread发送数据 1)在WorkerThread中
//在WorkerThread当中启动Looper,重写Handler的handleMessage()方法 //如果是MainThread接收消息则不需要写Looper的方法,只需要写handleMessage()方法 class WorkerThread extends Thread{ @Override public void run(){ //准备Looper对象 Looper.prepare(); //在WorkerThread当中生成Handler对象 handler = new handler(){ @Override public void handleMessage(Message msg){} } //调用Looper的loop()方法之后,Looper对象将不断地从消息队列中取出消息对象,然后调用handler的handleMessage()方法,处理该消息对象 //如果消息队列当中没有对象,则该线程阻塞 Looper.loop(); } } //启动WorkerThread线程 WorkerThread wt = new WorkerThread(); wt.start;
2)在MainThread中
//在MainThread中发送消息(利用Button) button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View view){ Message msg = handler.obtainMessage(); handler.sendMessage(msg); } })
推荐阅读
- Android项目中的config.xml文件 “config.xml”
- Android学习笔记 Intent
- Android(PowerManager类 电源管理)
- Android开发(《Gradle Recipes for Android》阅读笔记(翻译)3.1——使用Build Types)
- Android学习笔记 Activity的生命周期
- Android(或者Java)通过HttpUrlConnection向SpringMVC请求数据(数据绑定)
- 埃森哲面试体验(校园内)
- 算法题(递归程序打印三角形图案)
- 用所有其他的BitWise XOR替换数组的每个元素