用Handler也能同步操作

用Handler多数是为了异步操作,不阻塞UI线程的操作,可以防止ANR等。
今天看com.android.internal.telephony.gsm.SimSmsInterfaceManager的实现发现如下操作:

  1. Handler mHandler = new Handler() {
  2.         @Override
  3.         public void handleMessage(Message msg) {
  4.             switch (msg.what) {
  5.                 case EVENT_UPDATE_DONE:
  6.                     synchronized (mLock) {
  7.                         // ..................
  8.                         mLock.notifyAll();
  9.                     }
  10.                     break;
  11.                 case EVENT_LOAD_DONE:
  12.                     synchronized (mLock) {
  13.                         // ..................
  14.                         mLock.notifyAll();
  15.                     }
  16.                     break;
  17.             }
  18.         }
  19.     };
  20.  
  21. // ..................
  22.  
  23.     public boolean
  24.     updateMessageOnIccEf(int index, int status, byte[] pdu) {
  25.         // ........................
  26.         synchronized(mLock) {
  27.             Message response = mHandler.obtainMessage(EVENT_UPDATE_DONE);
  28.  
  29.             if (status == STATUS_ON_ICC_FREE) {
  30.                 // Special case FREE: call deleteSmsOnSim instead of
  31.                 // manipulating the SIM record
  32.                 mPhone.mCM.deleteSmsOnSim(index, response);
  33.             } else {
  34.                // ........................
  35.             }
  36.             try {
  37.                 mLock.wait();
  38.             } catch (InterruptedException e) {
  39.                 log("interrupted while trying to update by index");
  40.             }
  41.         }
  42.         return mSuccess;
  43.     }

感觉很是巧妙
在操作函数中(updateMessageOnIccEf),发送消息之后调用mLock.wait(),而在handler里处理消息结果的时候notifyAll(),感觉很是巧妙。

大家不一定能在实际中有什么用处,但是可以参考下



Posted in Android, Tech

无觅相关文章插件,快速提升流量