Android学习笔记(十三) Handler
Posted 学海无涯,回头是岸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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学习笔记(十三) Handler的主要内容,如果未能解决你的问题,请参考以下文章
ANDROID_MARS学习笔记_S01原始版_007_Handler及线程的简单使用