读书人

Android多线程中的Handler机制、Loope

发布时间: 2013-04-09 16:45:09 作者: rapoo

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
  1. public class Thread_Handler_Activity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_thread__handler_);
  6. LooperHandler thread=new LooperHandler();
  7. thread.start();
  8. }
  9. @Override
  10. public boolean onCreateOptionsMenu(Menu menu) {
  11. // Inflate the menu; this adds items to the action bar if it is present.
  12. getMenuInflater().inflate(R.menu.activity_thread__handler_, menu);
  13. return true;
  14. }
  15. }

自定义线程类:

[java] view plaincopy
  1. public class LooperHandler extends Thread{
  2. public Handler handler;
  3. @Override
  4. public void run() {
  5. // TODO Auto-generated method stub
  6. super.run();
  7. //初始化Looper对象
  8. Looper.prepare();
  9. //实例化一个Handler对象
  10. handler=new Handler(){
  11. @Override
  12. public void handleMessage(Message msg) {
  13. // TODO Auto-generated method stub
  14. super.handleMessage(msg);
  15. Log.d("BruceZhang", "This is Test!!!");
  16. }
  17. };
  18. Message msg=handler.obtainMessage();
  19. msg.what=1;
  20. handler.sendMessage(msg);
  21. Looper.loop();
  22. }
  23. }

运行的结果是在日志中显示一条信息,如图所示运行结果:

Android多线程中的Handler机制、Looper的引见与整理

但是,如果没有对Looper的声明,运行就会抛出如下的异常:

Android多线程中的Handler机制、Looper的引见与整理

所以,在实际的应用中,应考虑Handler在哪一个线程的中的实现。

读书人网 >Android

热点推荐