Android多线程中的Handler机制、Looper的介绍与整理
在多线程的开发中,Handler机制如同在主线程中运行一样,只是需要注意在非主线程中Handler机制的使用限制,本文将对这些内容作出解释。
如果在子线程中对上UI界面进行操作,将抛出异常。为此,Android中引入了Handler消息
传递机制,来实现在子创建的线程中更新UI界面,下面将对Handler消息传递机制进行介绍。
一.Looper简介
1.首先需要知道一个概念,那就是MessageQueue,在Android中,一个线程对应一个Looper对象
,而一个Looper对象又对应一个MessageQueue(消息队列)。MessageQueue用于存放Message,
在MessageQueue中,存放的消息以队列的模式执行。
2.Looper对象用来为一个线程开启一个消息循环,用来操作MessageQueue。默认情况下,Android
中新创建的线程是没有开启消息循环的,但是主线程除外,系统自动为主线程创建Looper对象,开启消息循 环。所以,在主线程中,应用下面的代码创建Handler对象时,不会出错。而如果在新创建的非主线程中,应用下面的代码创建Handler对象时,将产生异常信息。
如果想要在非主线程中,创建Handler对象,首先要使用Looper类的prepare()方法来初始化一个
Looper对象,然后创建这个Handler对象,再使用Looper对象的loop()方法,启动Looper,从消息队列里
获取和处理消息。
[java] view plaincopy
- public class Thread_Handler_Activity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_thread__handler_);
- LooperHandler thread=new LooperHandler();
- thread.start();
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.activity_thread__handler_, menu);
- return true;
- }
- }
自定义线程类:
[java] view plaincopy
- public class LooperHandler extends Thread{
- public Handler handler;
- @Override
- public void run() {
- // TODO Auto-generated method stub
- super.run();
- //初始化Looper对象
- Looper.prepare();
- //实例化一个Handler对象
- handler=new Handler(){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- Log.d("BruceZhang", "This is Test!!!");
- }
- };
- Message msg=handler.obtainMessage();
- msg.what=1;
- handler.sendMessage(msg);
- Looper.loop();
- }
- }
运行的结果是在日志中显示一条信息,如图所示运行结果:
但是,如果没有对Looper的声明,运行就会抛出如下的异常:
所以,在实际的应用中,应考虑Handler在哪一个线程的中的实现。