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对象。