2012-08-01 43 views
0

能否請一些建議的替代方法的一個活動是利用兩種不同的處理程序,或者讓我知道,這種方法好不好?多個處理程序可重用的代碼

詳情: 我在開發與Microchip的ADK Android的入門套件使用一些代碼的過程。一切都運行平穩,但是,我有一個問題,有兩個不同的處理程序在代碼中運行,它的工作原理,但我注意到,它不被推薦。 我用來創建時間延遲的第一個處理程序,並使用post命令啓動結果。第二個處理程序用於Microchip提供的用於與USB附件框架文件進行通信的示例代碼。我更喜歡只修改Microchip代碼而不是重寫它。 類似代碼:

public class MainActivity extends Activity 
{ ... 
    final Handler mHandler = new Handler(); // handler for startTimeDelay 
    ... 
    protected void onCreate(Bundle savedInstanceState) 
    { super.onCreate(savedInstanceState); 
     ... 
     Button btnSetTimeDelay = (Button) findViewById(R.id.btnChangeTimeDelay); 
     btnSetTimeDelay.setOnClickListener 
      ( new View.OnClickListener() 
       { public void onClick(View v) 
        { 
         setBackgroundColorLinearLayout(color.holo_red_dark); //red background 
         displayLockIsOpen(false); // display closed lock message 
         startTimeDelay(); // wait to open the lock 
        } 
       } 
      ); 
    } // onCreate 
    ... 
    final Runnable mUpdateResults = new Runnable() 
    { public void run() 
     { setBackgroundColorLinearLayout(color.holo_green_dark); //green background 
      displayLockIsOpen(true); // display open lock message 
     } 
    }; 

    protected void startTimeDelay() 
    { Thread t = new Thread() 
     { @override 
      public void run() 
      { SystemClock.sleep(global_delay); 
       mHandler.post(mUpdateResults); // run mUpdateResults code 
      }; 
     }; 
     t.start(); 
    } // startTimeDelay 

    // USB accessory handler from Microchip, for ADK 
    private Handler handler = new Handler() 
    { @override 
     public void handleMessage(Message msg) 
     { 
      ... 
      switch(msg.what) 
      { case USBAccessoryWhat: 
       ...lots of code here from Microchip 
      } // switch msg.what 
     } // handleMessage 
    }; // Handler 
} // MainActivity 
+0

我發現我可以刪除行:'最終處理程序mHandler =新的處理程序();'和重命名'mHandler.post(mUpdateResults);''到handler.post(mUpdateResults);'。 Microchip的代碼重寫Handler.handleMessage的事實對Handler.post方法沒有影響,並且它正常工作。 – ESC 2012-08-01 04:11:47

回答

0

您可以startTimeDelay和USB附件創建一個單一的處理程序本身兩者。

於Android的代碼。

public void dispatchMessage(Message msg) { 
     if (msg.callback != null) { 
      handleCallback(msg); 
     } else { 
      if (mCallback != null) { 
       if (mCallback.handleMessage(msg)) { 
        return; 
       } 
      } 
      handleMessage(msg); 
     } 
    } 

它,當你有一個回調(Runnable接口),它會調用handleCallback將打電話給你的Runnable.run方法,否則的handleMessage將被調用說。

所以,你可以有一個單一的處理程序。

0

維韋克感謝您的回答。我還發現,我可以刪除行:

final Handler mHandler = new Handler(); // handler for startTimeDelay

,並重新命名

mHandler.post(mUpdateResults); // run mUpdateResults code

handler.post(mUpdateResults); // run mUpdateResults code

是Microchip的代碼覆蓋的handleMessage有事實對.post方法沒有影響,並且它正常工作。給我下面的代碼。

public class MainActivity extends Activity 
{ ... 
// final Handler mHandler = new Handler(); // handler for startTimeDelay, not needed 
    ... 
    protected void onCreate(Bundle savedInstanceState) 
    { super.onCreate(savedInstanceState); 
     ... 
     Button btnSetTimeDelay = (Button) findViewById(R.id.btnChangeTimeDelay); 
     btnSetTimeDelay.setOnClickListener 
      ( new View.OnClickListener() 
       { public void onClick(View v) 
        { 
         setBackgroundColorLinearLayout(color.holo_red_dark); //red background 
         displayLockIsOpen(false); // display closed lock message 
         startTimeDelay(); // wait to close the lock 
        } 
       } 
      ); 
    } // onCreate 
    ... 
    final Runnable mUpdateResults = new Runnable() 
    { public void run() 
     { setBackgroundColorLinearLayout(color.holo_green_dark); //green background 
      displayLockIsOpen(true); // display open lock message 
     } 
    }; 

    protected void startTimeDelay() 
    { Thread t = new Thread() 
     { @override 
      public void run() 
      { SystemClock.sleep(global_delay); 
       handler.post(mUpdateResults); // run mUpdateResults code 
       // changed from mHandler to handler, defined below 
      }; 
     }; 
     t.start(); 
    } // startTimeDelay 

    // USB accessory handler from Microchip, for ADK 
    private Handler handler = new Handler() 
    { @override 
     public void handleMessage(Message msg) 
     { 
      ... 
      switch(msg.what) 
      { case USBAccessoryWhat: 
       ...lots of code here from Microchip 
      } // switch msg.what 
     } // handleMessage 
    }; // Handler 
} // MainActivity 

對於我來說,這是因爲我沒有需要重寫任何代碼簡單,但我不知道是否它更好的做法與否。您的代碼至少會將代碼讀取器指向處理程序的一個位置,而在我的版本中,mUpdateResults的運行在處理程序例程中並不明確可見。

相關問題