2012-09-05 32 views
2

我有一個圖像應用程序,我在顯示圖像時播放音樂。 現在,我在UI線程中都具有這些功能。在非UI線程中運行代碼android

我想將音樂播放部分移到另一個與UI線程不同的線程。

我該如何做到這一點?

,如果我使用的處理程序和可運行的複雜性:

運行()必須具有的一切,是因爲它是基於事件上執行 但音樂代碼是散佈在整個的地方,有一個不同一段代碼來執行每一次

,所以我可以與處理器和可運行實現這一目標的唯一途徑是,如果我每做一個特定的功能 這意味着所有的音樂代碼將無法在同一個線程中運行多個可運行,他們會運行在不同的線程 這不是一件好事。

那麼你如何做到這一點?

+0

那麼你成功了嗎?或者你需要一些其他方法,而不是我的答案? – alex

+0

是的,我成功地做到了。這就是我所做的。 public static void startTrack(){ \t \t PLAYER_STATE = IS_PLAYING; \t \t //mPlayer.start(); \t \t \t \t/*設定的處理程序,並運行的*/ \t mMusicHandler =新的處理程序(){\t \t \t }; \t \t \t \t mMusicRunnable =新的Runnable(){ \t \t \t公共無效的run(){ \t \t \t \t Log.d(TAG, 「音樂內可運行」); \t \t \t \t嘗試{ \t \t \t \t \t mPlayer.start(); \t \t \t \t \t \t}趕上(IllegalStateException異常E){ \t \t \t \t \t日誌。d(TAG,「ILLEGAL STATE-START」); \t \t \t \t \t handleIllegalState(); \t \t \t \t} \t \t \t} \t \t}; \t \t mMusicHandler.post(mMusicRunnable); \t \t \t} – Namratha

回答

0

這是我做過什麼:

public static void startTrack() { 
    PLAYER_STATE = IS_PLAYING; 
      /*Setup the handler and runnable*/ 
    mMusicHandler = new Handler() {   
    }; 

    mMusicRunnable = new Runnable() { 
     public void run() { 
      Log.d(TAG,"inside Music Runnable"); 
      try { 
       mPlayer.start();   
      } catch (IllegalStateException e) { 
       Log.d(TAG,"ILLEGAL STATE-START"); 
       handleIllegalState(); 
      } 
     } 
    }; 
    mMusicHandler.post(mMusicRunnable); 

} 

所以只有音樂設置的開始部分是在不同的線程來完成。

+3

'new Handler()'被附加到正在運行的線程上。如果從UI線程調用'startTrack()',那麼'mPlayer.start()'也將在UI線程中被調用。 – azizbekian

0

我會建議創建一個ServiceBinder - 你會有一個處理它。在Service中創建一個Executor(池中有單個或多個Thread - 取決於您的應用程序結構和事件; Queue實現也是如此),然後將音樂事件傳遞給執行程序。