Handler 和callback 机制

Handler主要用来在线程之间的通信的机制。如在Activity或Service中需要接收其他线程的消息,则在需要接收消息的Activity或Service中需要实现Callback接口。下面是PowerManagerService中用于接收其他线程消息的handleMessage()的例子:

[java]  view plain  copy
  1. private final class PowerManagerHandler extends Handler {  
  2.     public PowerManagerHandler(Looper looper) {  
  3.         super(looper, nulltrue /*async*/);  
  4.     }  
  5.   
  6.     @Override  
  7.     public void handleMessage(Message msg) {  
  8.         switch (msg.what) {  
  9.             case MSG_USER_ACTIVITY_TIMEOUT:  
  10.                 handleUserActivityTimeout();  
  11.                 break;  
  12.             case MSG_SANDMAN:  
  13.                 handleSandman();  
  14.                 break;  
  15.             case MSG_SCREEN_ON_BLOCKER_RELEASED:  
  16.                 handleScreenOnBlockerReleased();  
  17.                 break;  
  18.             case MSG_CHECK_IF_BOOT_ANIMATION_FINISHED:  
  19.                 checkIfBootAnimationFinished();  
  20.                 break;  
  21.         }  
  22.     }  
  23. }  

然后在创建Handler的地方将实现了Callback的类的实例传入:

[java]  view plain  copy
  1. public void init(Context context, LightsService ls,  
  2.         ActivityManagerService am, BatteryService bs, IBatteryStats bss,  
  3.         DisplayManagerService dm) {  
  4.     mContext = context;  
  5.     mLightsService = ls;  
  6.     mBatteryService = bs;  
  7.     mBatteryStats = bss;  
  8.     mDisplayManagerService = dm;  
  9.     mHandlerThread = new HandlerThread(TAG);  
  10.     mHandlerThread.start();  
  11.     mHandler = new PowerManagerHandler(mHandlerThread.getLooper());//将实现了Callback类的实例传入  
  12.   
  13.     Watchdog.getInstance().addMonitor(this);  
  14.   
  15.     // Forcibly turn the screen on at boot so that it is in a known power state.  
  16.     // We do this in init() rather than in the constructor because setting the  
  17.     // screen state requires a call into surface flinger which then needs to call back  
  18.     // into the activity manager to check permissions.  Unfortunately the  
  19.     // activity manager is not running when the constructor is called, so we  
  20.     // have to defer setting the screen state until this point.  
  21.     mDisplayBlanker.unblankAllDisplays();  
  22. }  


然后当在线程中可使用如下代码向PowerManagerService发送消息:

[java]  view plain  copy
  1. private void shutdownOrRebootInternal(final boolean shutdown, final boolean confirm,  
  2.         final String reason, boolean wait) {  
  3.     if (mHandler == null || !mSystemReady) {  
  4.         throw new IllegalStateException("Too early to call shutdown() or reboot()");  
  5.     }  
  6.   
  7.     Runnable runnable = new Runnable() {  
  8.         @Override  
  9.         public void run() {  
  10.             synchronized (this) {  
  11.                 if (shutdown) {  
  12.                     ShutdownThread.shutdown(mContext, confirm);  
  13.                 } else {  
  14.                     ShutdownThread.reboot(mContext, reason, confirm);  
  15.                 }  
  16.             }  
  17.         }  
  18.     };  
  19.     // ShutdownThread must run on a looper capable of displaying the UI.  
  20.     Message msg = Message.obtain(mHandler, runnable);  
  21.     msg.setAsynchronous(true);  
  22.     mHandler.sendMessage(msg);//向PowerManagerService发送message  
  23.   
  24.     // PowerManager.reboot() is documented not to return so just wait for the inevitable.  
  25.     if (wait) {  
  26.         synchronized (runnable) {  
  27.             while (true) {  
  28.                 try {  
  29.                     runnable.wait();  
  30.                 } catch (InterruptedException e) {  
  31.                 }  
  32.             }  
  33.         }  
  34.     }  

当执上面的代码之后,创建这个Handler(PowerManagerHandler)时使用Callback实例的handleMessage将会被调用。

 

可以使用如下代码将一个线程实例放入到Handler中使其执行:

[java]  view plain  copy
  1. if(mHandler != null) {  
  2.     mHandler.removeCallbacks(mStopDetectionTimeoutRunnable);  
  3.     mHandler.postDelayed(mStopDetectionTimeoutRunnable, WAIT_FOR_DETECTION_TIMEOUT);  
  4. }  

可使用如下代码删除这个线程:

[java]  view plain  copy
  1. if(mHandler != null) {  
  2.     mHandler.removeMessages(MSG_OPEN_LENOVO_SMART_STANDBY_CAMERA_SUCCESS);  
  3.     mHandler.removeCallbacks(mStopDetectionTimeoutRunnable);  
  4. }  

 Handler上还有许多类似的发送消息或添加线程的方法。

你可能感兴趣的:(Android)