这次浅谈一下Handler,为什么会出现Handler这个功能特性呢?首先,在之前的基本控件,基本都是在Activity的onCreate(Bundle savedInstanceState)方法中调用和处理的,但是,在有些情况,比如在网络上下载软件等一些需要等待响应时间比较长的操作,如果同样放在Activity的该方法中的话,那么在执行该方法的时候,整个Activity是不可动的,用户只能干等着,这样的用户体验是十分差的,这种处理方式带来的最好结果是等待了一段时间后,得到了想要的结果,不好的情况就是等了N久,也没有出现结果,有的甚至会使Activity报错,为了避免这些情况的发生,所以引入了Handler的特性,他就像是一个线程队列,它也是一种异步的消息处理。
- <Button
- android:id="@+id/start"
- android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- android:text="@string/start"
- />
- <Button
- android:id="@+id/stop"
- android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- android:text="@string/stop"
- />
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class HandlerDemo1Activity extends Activity {
- Button startButton = null;
- Button endButton = null;
- Handler handler = new Handler();
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- startButton = (Button)findViewById(R.id.start);
- startButton.setOnClickListener(new StartListener());
- endButton = (Button)findViewById(R.id.end);
- endButton.setOnClickListener(new EndListener());
- }
- class StartListener implements OnClickListener{
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- handler.post(HandlerThread);
- }
- }
- class EndListener implements OnClickListener{
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- handler.removeCallbacks(HandlerThread);
- }
- }
- Runnable HandlerThread = new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- System.out.println("HandlerThread is Running......");
- handler.postDelayed(HandlerThread, 3000);
- }
- };
- }
我们来看下面这个例子
- 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 HandlerDemo2Activity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- System.out.println("Activity---->"+Thread.currentThread().getName());
- HandlerThread handlerThread = new HandlerThread("HandlerThread");//创建一个HandlerThread对象,它是一个线程
- handlerThread.start();//启动线程
- MyHandler myHandler = new MyHandler(handlerThread.getLooper());//创建一个MyHandler对象,该对象继承了Handler,从下面的MyHandler类中可以看到,调用的是Handler父类的Handler(Looper looper)的构造函数,而这里传进去的Looper对象是从HandlerThread中取得的。
- Message msg = myHandler.obtainMessage();//获得消息对象
- msg.sendToTarget();//把得到的消息对象发送给生成该消息的Handler,即myHandler,当myHandler接收到消息后,就会调用其handleMessage的方法来处理消息
- }
- class MyHandler extends Handler{
- public MyHandler() {//构造函数
- // TODO Auto-generated constructor stub
- }
- public MyHandler(Looper looper){//构造函数
- super(looper);//实现了父类的该构造函数
- }
- @Override
- public void handleMessage(Message msg) {//当这个Handler接收到Message对象的时候,会自动调用这个方法,来对Message对象进行处理
- // TODO Auto-generated method stub
- System.out.println("Handler---->"+Thread.currentThread().getName());
- }
- }
- }