什麼是目前正與我的Android應用程序發生播放同一文件:使用的MediaPlayer多次與重疊
我映射一個簡單的圖像按鈕,並讓它在點擊播放聲音。每次點擊時,我在原始文件夾中創建一個帶有聲音文件的MediaPlayer對象,爲該MediaPlayer對象設置一個OnClickListener,該對象將停止播放該文件並將其釋放,然後播放MediaPlayer對象。
爲定義的部分代碼:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
ImageButton start = (ImageButton) findViewById(R.id.imageButton1);
start.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
MediaPlayer play = MediaPlayer.create(MainActivity.this, R.raw.dvno);
play.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.stop();
mp.release();
mp = null;
}
});
play.start();
}
});
}
有什麼不妥的地方:
它工作正常,並不會崩潰,但它是可怕的記憶和一般很慢。我希望用戶能夠儘可能快地點擊按鈕多次,並且聽到瞬間重複播放的聲音。每次點擊創建一個新的MediaPlayer對象並等待它完成並釋放時,會消耗太多資源,並且聲音往往落後於實際按下按鈕。我希望能夠創建一個單獨的聲音作爲MediaPlayer對象,它可以在重疊播放時播放。
可能的解決方案:
中的onCreate而不是的onClick範圍創建一個最終的MediaPlayer對象,並以某種方式使用線程開始的每次點擊的MediaPlayer對象。我讀到這可能是一個可能的解決方案,但我之前從未使用過線程,我不知道它們是否比我當前的代碼慢,如果不慢,所以我想知道是否有解決方案,而不使用可能更簡單的線程。在這一點上操作單個MediaPlayer的狀態似乎是不可能的,但也許我錯了。
這會因爲非法狀態而導致程序崩潰嗎?如果不是,這會比我想要的慢嗎?如果沒有,任何人都可以提出修正我的代碼?
我認爲一個SoundPool真的會更適合這裏根據您的要求。 MediaPlayer是一個非常重的高延遲對象,通常用於播放視頻和長音樂曲目。 SoundPool用於保存將以低延遲快速播放,重疊播放的短片。剪輯初始化一次,然後每次您想播放聲音時都可以調用播放。我相信唯一的限制是未壓縮的聲音必須小於1MB,儘管我不積極。 – Tim