在android下编程如果要用到线程就必然要用到Handler、Looper或者LooperThread,这三者时间的联系与区别是什么呢?通过看SDK、上网看别人写的博客以及自己编程实践,到底是对这三者有了一定的了解,现在将自己的理解写下来,希望对大家可以有点帮助。
Handler:每个Handler实例都与创建该Handler的线程以及线程的消息队列想关联,而Handler的主要作用就是对消息队列进行管理,主要体现在处理或者发送message以及Runnable对象。
Looper:Looper用于维护一个一个线程的消息循环和消息队列,在我看来Looper做的事一些相对较底层的维护工作(本人是一个菜鸟,没有看到这么底层)。一个线程只要有了Looper来管理,就可以接收消息并处理。所以是Looper是用来维护消息队列的,Handler是处理消息队列的消息的。在主线程中,我们可以直接用Hanler来处理消息,这是因为主线程已经有了Looper来维护消息队列了。如果是子线程,就需要自己创建Looper了。
接下来看看SDK上的示例
class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } }
好了,说了这么多,还是上上代码吧:
package org.asia;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ThreadTestActivity extends Activity {
private TextView text;
private Button button;
private LooperThread loop;
private Handler hand;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text=(TextView)findViewById(R.id.text);
button=(Button)findViewById(R.id.button);
loop=new LooperThread();
loop.start();
hand=loop.getHandler();
button.setOnClickListener(new OnClickListener()
{
public void onClick(View v) {
// TODO Auto-generated method stub
hand.sendMessage(null);
}
});
}
class LooperThread extends Thread
{
private Handler handler;
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Looper.prepare();//创建Looper
handler=new Handler()//创建子线程的handler并且重写handleMessage函数
{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
System.out.println(Thread.currentThread().getName());
}
};
Looper.loop();//是Looper开始运行起来
}
Handler getHandler()
{
return handler;
}
}
}
HandlerThread:通过以上的代码可以看见,我们需要自己去管理Looper的创建和运行。那么可不可以有一个类把handler和looper都给我们封装好了呢?答案是有,这个类就是HandlerThread类。关于这个类就不需要多说了,大家随便看个代码示例就可以了解了。这里给大家一个链接看看:点击打开链接
LLooperLooperLooperLooperooper