Handler和Looper以及Thread的关系的简单备注

//====================== 以下是网上的 begin===========================

更新UI的时候主线程必须是目标线程,如何掌握这个主动性?是通过Looper和HandlerThread实现的。Android中每一个线程都跟着一个Looper,Looper可以帮助线程维护一个消息队列,Looper对象的执行需要初始化Looper.prepare()方法,使用Looper.loop()方法启动消息队列管理机制,退出时还要使用Looper.release()方法释放资源

//====================== 以上是网上的 end===========================

Android中每一个线程(Thread)都跟着一个Looper,Looper可以帮助线程(Thread)维护一个消息队列。

Handler初始化的时候需要一个Looper,如果没有指定默认就是主线程的Looper。如果想和子线程的Looper绑定,可以用HandlerThread,HanderThread类继承了Thread类,它封装了Looper对象,使我们不用关心Looper的开启和释放的细节问题。

这有个例子可以参考一下:http://www.cnblogs.com/nanguabing/archive/2012/10/25/2738713.html

 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.HandlerThread; 
import android.os.Looper; 
import android.os.Message; 
  
public class MainActivity extends Activity{ 
  
  
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        // 打印UI线程的名称 
        System.out.println("onCreate  CurrentThread = "
                + Thread.currentThread().getName()); 
  
        setContentView(R.layout.activity_main); 
  
        // 实现了使用Looper来处理消息队列的功能 
        HandlerThread handlerThread = new HandlerThread("handler_Thread"); 
        handlerThread.start(); 
        MyHandler myHandler = new MyHandler(handlerThread.getLooper());//myHandler和我们创建的handlerThread线程的looper绑定,就可以和handlerThread线程的消息队列绑定 
        Message msg = myHandler.obtainMessage(); //myHandler得到一个消息,是子线程handlerThread的消息队列的消息
        msg.obj = "abc"; 
        Bundle data = new Bundle(); 
        data.putString("title", "你好吗"); 
        data.putString("info", "哈哈哈哈"); 
        msg.setData(data); 
        // 将msg发送到对象,所谓的目标对象就是生成该msg对象的Handler对象 
        msg.sendToTarget(); 
  
    } 
  
    class MyHandler extends Handler { 
        public MyHandler() { 
  
        } 
  
        public MyHandler(Looper looper) { 
            super(looper); 
        } 
  
        @Override
        public void handleMessage(Message msg) { 
            // TODO Auto-generated method stub 
            String s = (String) msg.obj; 
            Bundle data = msg.getData(); 
            String title=data.getString("title"); 
            String info=data.getString("info");    
            System.out.println("title is " + title + ", info is" + info);   
            System.out.println("msg.obj is " + s);   
            System.out.println(Thread.currentThread().getId()); 
            System.out.println("handlerMessage"); 
        } 
  
    } 
} 

 

 HandlerThread继承与Thread,所以本身就是一个线程。他类似于创建了一个含有Looper对象的线程类,而Looper可以用于创建Handler类,这样我们就不用自己实例化Looper对象,调用preare和Loop了,而是直接调用HandlerThread。与普通的Thread相比,就是多了Looper对象。

posted @ 2012-12-29 13:57  xxzjjcbx  阅读(203)  评论(0编辑  收藏  举报