相关连接: Android 消息处理机制之一: Handler 与 Message
Android 消息处理机制之二: Message 中 obtain()源代码剖析
Android 消息处理机制之三: Handler 中 sendMessage() 源代码剖析
上一讲我们学习Handler和Message的一些使用方式,我们知道Handler它会发送消息和处理消息,并且关联一个子线程,如何发送消息入队和出队处理消息等这些都是交给Looper去管理分发的,也就是它是负责整个消息队列运转的一个类,这一讲我们就来学习一下Android中的Looper的操作。
一、Looper类介绍
这个类是用来在一个线程中运行一个消息循环(Message),默认情况下线程是没有一个消息循环来关联它们的,在这个线程中调用prepare()方法来启动一个循环,然后调用loop()就可以处理消息至到循环停止。下面就是一个典型的例子实现一个Looper线程,使用 prepare()方法 和 loop()来创建一个初始的Handler并且能够与消息循环(Looper)进行沟通关联
【注意】:默认情况下的android新诞生的一个线程是没有开启一个消息循环(Looper)的,但是主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环。
二、程序Demo
1. 布局文件定义一个Button和TextView,这里不贴出来,读者可以阅读附件源码
2. MainActivity.java
... public class MainActivity extends Activity { private Button btn; private TextView txt; private MyHandler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... mHandler = new MyHandler(); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 启动线程 new Thread(new MyThread()).start(); } }); } public class MyThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub Message msg = Message.obtain(); msg.obj = "AHuier"; mHandler.sendMessage(msg); } } public class MyHandler extends Handler { public MyHandler() { super(); // TODO Auto-generated constructor stub } // Handler中有个传递Looper对象的构造方法,这个构造方法比较少用 public MyHandler(Looper looper) { super(looper); // TODO Auto-generated constructor stub } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); txt.setText("接受子线程发送的消息 --->" + msg.obj); } } ... }
3. 程序执行结果