2012-02-06 20 views
1

我有一個服務類運行我的mediaplayer它工作正常,我唯一的問題是,當我的服務創建mediaplayer它有點暫停我的用戶界面,像它的掛起或東西,直到我的mediaplayer完成創建它自己。我想要發生的是,當我按下播放按鈕時,出現一個吐司消息並顯示「正在連接」,當mediaplayer準備顯示吐司消息說「已連接」時,mediaplayer開始播放音樂,不知何故,我的吐司不顯示,如果他們就其後期..mediaplayer和服務類

繼承人我的服務代碼:

public class myservice extends Service { 

MediaPlayer player; 
private Handler UIHandler = new Handler(); 
private Uri source = Uri.parse("http://www.mydomain.com:8000/listen.mp3"); 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

public void onCreate() { 
    Toast.makeText(this, "Connecting", Toast.LENGTH_SHORT).show(); 
      player = MediaPlayer.create(this, source); 
} 

private void testtoast() { 
    Toast.makeText(this, "Connecting", Toast.LENGTH_SHORT).show(); 
} 

public void onStart(Intent intent, int StartId) { 
    Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); 
    player.setOnPreparedListener(new OnPreparedListener() { 
     public void onPrepared(MediaPlayer player) { 
      // TODO Auto-generated method stub 
      player.start(); 
     } 
    }); 
} 

public void onDestroy() { 
    Toast.makeText(this, "Destroyed", Toast.LENGTH_SHORT).show(); 
    player.stop(); 
    player.release(); 
} 
    } 
+0

我個人從未使用過'MediaPlayer'類,所以我不知道使用它的任何方法,或者當'.create()'時它的行爲如何。然而,我認爲值得指出的是'Service'在UI線程內運行,*不在其自己的線程或進程內運行。這意味着您在'Service'中執行的任何耗時的工作,例如'onCreate()',都會影響UI的響應性,如果不小心的話,甚至會導致ANR。因此,您在「服務」中執行的任何耗時或過程密集型工作仍應在單獨的「線程」上完成。 – Trevor 2012-02-06 18:03:20

+0

感謝指出,特雷弗你有一個樣本,我怎麼能做到這一點..我是一個noob在Android真的 – HeartlessArchangel 2012-02-06 23:43:40

回答

0

更換

 player = MediaPlayer.create(this, source); 

 player = new MediaPlayer(); 
     player.setDataSource(source); 
     player.prepareAsync(); 

MediaPlayer.create調用prepare()準備MediaPlayer的方法是一個同步操作並掛起UI,因此您將在UI中遇到延遲。所以你應該明確地使用.prepareAsync()來避免這個延遲,如上面的例子所提供的。