Looper和Handler

一般情况下,我们启动一个线程,是让它完成一件任务,完成该任务后,线程就退出了。还有一种情况,我们希望该线程一直在运行,我们会时不时的向该线程发送一些消息,线程接收到该消息后,执行相应的操作,执行完成后,线程不退出,等待下一个消息,这很像所谓的“事件触发”。在Android上,使用Looper和Handler很容易实现该功能。
故名思意,Looper就是一个消息循环,而Handler就是一个消息处理器,在非UI线程中,线程默认是不存在消息循环的,因此在创建Handler的时候会抛出异常,在创建Handler对象之前,必须调用Looper.prepare(),然后创建Handler对象,最后启动消息循环:Looper.loop();


  1. public class LoopThread extends Thread {  
  2.       public interface HandlerCreater {  
  3.               Handler createHandler();  
  4.       }  
  5.       private Handler mHandler = null;  
  6.       private HandlerCreater mHandlerCreater;  
  7.       LoopThread(HandlerCreater hc) {  
  8.             mHandlerCreater = hc;  
  9.       }  
  10.   
  11.       @Overwrite  
  12.       public void run() {  
  13.             Looper.prepare();  
  14.             mHandler = mHandlerCreater.createHandler();  
  15.             Looper.loop();  
  16.             mHandler = null;  
  17.       }  
  18.   
  19.       public void sendMessage(Message msg) {  
  20.             if (null != mHandler) {  
  21.                    mHandler.sendMessage(msg);  
  22.             }  
  23.       }  
  24. }  
public class LoopThread extends Thread {
      public interface HandlerCreater {
              Handler createHandler();
      }
      private Handler mHandler = null;
      private HandlerCreater mHandlerCreater;
      LoopThread(HandlerCreater hc) {
            mHandlerCreater = hc;
      }

      @Overwrite
      public void run() {
            Looper.prepare();
            mHandler = mHandlerCreater.createHandler();
            Looper.loop();
            mHandler = null;
      }

      public void sendMessage(Message msg) {
            if (null != mHandler) {
                   mHandler.sendMessage(msg);
            }
      }
}
这样,在主线程中只要实现一个HandleCreater,创建出自己合适的Handler,然后就可以启动线程,并向其发消息了。
跳出消息循环使用:Looper.myLooper().quit();

一般情况下,我们启动一个线程,是让它完成一件任务,完成该任务后,线程就退出了。还有一种情况,我们希望该线程一直在运行,我们会时不时的向该线程发送一些消息,线程接收到该消息后,执行相应的操作,执行完成后,线程不退出,等待下一个消息,这很像所谓的“事件触发”。在Android上,使用Looper和Handler很容易实现该功能。
故名思意,Looper就是一个消息循环,而Handler就是一个消息处理器,在非UI线程中,线程默认是不存在消息循环的,因此在创建Handler的时候会抛出异常,在创建Handler对象之前,必须调用Looper.prepare(),然后创建Handler对象,最后启动消息循环:Looper.loop();


  1. public class LoopThread extends Thread {  
  2.       public interface HandlerCreater {  
  3.               Handler createHandler();  
  4.       }  
  5.       private Handler mHandler = null;  
  6.       private HandlerCreater mHandlerCreater;  
  7.       LoopThread(HandlerCreater hc) {  
  8.             mHandlerCreater = hc;  
  9.       }  
  10.   
  11.       @Overwrite  
  12.       public void run() {  
  13.             Looper.prepare();  
  14.             mHandler = mHandlerCreater.createHandler();  
  15.             Looper.loop();  
  16.             mHandler = null;  
  17.       }  
  18.   
  19.       public void sendMessage(Message msg) {  
  20.             if (null != mHandler) {  
  21.                    mHandler.sendMessage(msg);  
  22.             }  
  23.       }  
  24. }  
public class LoopThread extends Thread {
      public interface HandlerCreater {
              Handler createHandler();
      }
      private Handler mHandler = null;
      private HandlerCreater mHandlerCreater;
      LoopThread(HandlerCreater hc) {
            mHandlerCreater = hc;
      }

      @Overwrite
      public void run() {
            Looper.prepare();
            mHandler = mHandlerCreater.createHandler();
            Looper.loop();
            mHandler = null;
      }

      public void sendMessage(Message msg) {
            if (null != mHandler) {
                   mHandler.sendMessage(msg);
            }
      }
}
这样,在主线程中只要实现一个HandleCreater,创建出自己合适的Handler,然后就可以启动线程,并向其发消息了。
跳出消息循环使用:Looper.myLooper().quit();

猜你喜欢

转载自blog.csdn.net/hizhangyuping/article/details/80777082