2016-02-27 93 views
0

我使用SoundPool播放聲音效果,但現在我需要切換到MediaPlayer,因爲我需要聽onCompletion事件觸發GUI更改。MediaPlayer主線程android

我的問題是:

  • 聲音文件非常小,不到30KB,我可以在主線程中使用 MediaPlayer

  • 我可以叫mediaPlayer.stop()該劇像這樣做後,

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    public void onCompletion(MediaPlayer mediaPlayer) { 
        //Do some GUI changes 
        mediaPlayer.stop(); 
        mediaPlayer.release(); 
        } 
    }); 
    

然後再踢效果會做到這一點:

mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1); 
mediaPlayer.start(); 

那麼,是不是確定每次我發揮效果時創建和發佈?

回答

1

MediaPlayer生命週期初始化您MediaPlayer

MediaPlayer mediaPlayer = new MediaPlayer(); 
AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid); 
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
afd.close(); 

看:

enter image description here

當跟蹤完成後,MediaPlayerStopped狀態,並且您wan't更改曲目,所以: 致電reset()' to get to空閒then setDataSource then準備and finally start()`。

1

聲音文件非常小,小於30kB,我可以在主線程中使用MediaPlayer嗎?

無論您的音頻文件的大小如何,您都應該在其自己的線程上運行MediaPlayer,尤其是在您播放來自網絡的文件時。如果不這樣做,可能會導致ANR(在你的情況,我不認爲太多的擔心)

我可以叫mediaPlayer.stop()播放完成

後有沒有必要在每個音頻文件之後釋放MediaPlayer。一旦你不再使用它,就釋放它。

我怎樣才能加載新的聲音

AssetFileDescriptor audio = context.getResources().openRawResourceFd(R.raw.next_audio); 
mediaPlayer.setDataSource(audio);