2011-03-03 42 views
1

我想創建一個音樂流應用程序。 到目前爲止,它工作得很好。 我使用的TextView沒有從按鈕內點擊點擊

​​

方便的方法,以製備無限流(24×7的mp3流)。 它在這個調用上掛了幾秒鐘,我把它整齊地塞進我的startPlaying()方法中。 該按鈕不會顯示它被點擊,直到流開始播放之後,用戶纔開始想知道他們是輕按了按鈕還是錯過了。 所以我想更新一個TextView標籤旁邊的按鈕,說「等...」或「緩衝」等,然後在流開始後清除它,所以用戶知道他們按下按鈕確定。 即使我在調試中經過這一步,標籤不會更新,直到onClick完成。我可以註釋掉清除標籤文本的最後一行,並可以看到它設置爲「緩衝...」確定。但只有在它退出onClick後。這是使用媒體播放器create()方法的限制嗎?

final Button startbutton = (Button) findViewById(R.id.Button01); 
this.tvBuffering = (TextView) findViewById(R.id.tvBuffering); 

startbutton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      tvBuffering.setText("Buffering..."); 
      //do something like invalidate() here?? 
      startPlaying(); //blocks here for a few seconds to buffer then plays. 
      tvBuffering.setText(" "); //clear the text since it's playing by now. 
     } 
    }); 

回答

1

這不是個好主意,故意包括那種在UI的延遲,因爲任何事情的用戶嘗試對那些幾秒鐘這樣做只會阻塞。我假設你的startPlaying()包括致電prepare(),以及start()。當從不可立即使用的數據源(例如數據流)獲取數據時,應該使用prepareAsync(),這將開始準備並立即返回,而不是阻止,直到準備完成。

您可以將回調到您MediaPlayer到再採取行動,一旦準備已經經歷了MediaPlayer.OnPreparedListener

完成下面是一個簡單的例子。請注意,您的OnClickListener可以保持不變,只要您將startPlaying()方法中的prepare()更改爲prepareAsync(),並從startPlaying()中刪除start()呼叫。

startbutton.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     tvBuffering.setText("Buffering..."); 

     startPlaying(); //which should call prepareAsync() instead of prepare() 
         //and have no call to start() 
    } 
}); 

mYourMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     start(); 
     tvBuffering.setText(" "); 
    } 
}); 
+0

太棒了!太感謝了! –