2013-07-19 45 views
0

我想在Android Service類中使用MediaPlayer創建restart()函數。 它會重新啓動MediaPlayer,並嘗試再次連接到相同的URL,如果發生錯誤,特別是IO Exception。在Android上重新啓動MediaPlayer on IO異常

什麼是嘗試多次連接重試的最佳方式?有可能在通話之間進行延遲。它可以在使用Thread.sleep的重啓功能中完成,但可能這不好,因爲掛起服務。在重新啓動期間,用戶可能需要呼叫另一個站點URL,因此重新啓動必須以此方式取消。

這裏是潛在功能的例子...

public void restart() 
{ 
    try 
    { 
     this.playlist="ERROR";  
     for (int u=1; u<5; u++) 
     { 
      if (on==false) 
      { 
       Thread.sleep(15000); // maybe bad 
       mplayer.reset(); // 
       String currenturl2=currenturl; 
       currenturl=""; 
       playSong(getApplicationContext(),currenturl2); // starting play 
       playlist="RESTARTING...("+String.valueOf(u)+")"; 
      // we must block retries somehow when we catch playing again 
      }; 
     }; 

    } 
    catch (Exception e) 
    { 
     playlist="RESTART ERROR"; 
     Log.e(TAG2,"a"+e.toString()); 
    } 
} 

這可能不是做一個週期的重啓,並在異常引發新的重啓... 也許有人有一些現成的代碼/算法看。

回答

0

您還需要使用onError()方法來處理引起的各種錯誤。當您重試時,還可以使用onPreparedListener標記播放器何時準備就緒。

而不是使用Thread.sleep(),將每次重試之間的延遲,你可能需要使用HandlerpostDelayed(Runnable, time)方法對於每個重試,其結果得到了循環擺脫並進行遞歸調用。

如果您足夠耐心,我可能會嘗試簡單編寫此方法的遞歸版本。

+0

謝謝。我有onError方法,但還無法模仿它的工作。第一個異常不會出現在Error中(當我禁用網絡時,但其他情況下可能會觸發onError)。但是在任何情況下,我都可以路由到restart()函數。也許一個新的線程不是必需的。據我所知,在異常情況下可能會有幾次重新啓動()的調用。儘管如此,一會兒只有一次重新啓動,並且不能多次啓動流。我需要儘快穩定版本,但最好使用最簡單的穩定版本。 – Tramway11