2012-05-14 91 views
0

這裏是我的代碼:NullPointerException異常與MediaPlayer的

MediaPlayer a1,a2,a3...a24; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.a); 
    a1 = MediaPlayer.create(this, R.raw.a1); 
    a2 = MediaPlayer.create(this, R.raw.a2); 
    a3 = MediaPlayer.create(this, R.raw.a3); 
      ... 
    a24 = MediaPlayer.create(this, R.raw.a24); 
} 

private void play(MediaPlayer p) { 
    p.start(); 
} 

的問題是,如果我打A1,A2,A3一切是正確的,但如果我打A24,我得到一個NullPointerException。 24個音頻文件的大小約爲25Kb,所以我不認爲這是內存消耗的問題。我曾嘗試在開始比賽前延遲,但似乎沒有任何幫助。 Android文檔沒有解釋太多這個問題;我該怎麼辦?

+1

編碼很糟糕。 –

+2

對於每種聲音,您都不需要單獨的MediaPlayer。創建一個MediaPlayer,然後播放資產文件夾中的聲音 – Tony

+0

@Tony我應該怎麼做?顯然,我必須在每次播放聲音時創建()MediaPlayer,並在完成後釋放()它。 – michelemarcon

回答

0

您是否在調用create()之後真的檢查了a24的值?它是否爲NULL?我認爲你已經遇到了可以創建的MediaPlayer對象數量的限制。有在MediaPlayer的和的Soundpool這裏偉大的職位: http://www.stealthcopter.com/blog/2010/08/android-soundpool-vs-mediaplayer-focus-on-soundboards-and-memory-problems/

+0

無論延遲如何,它始終爲空。顯然,我必須每次創建()MediaPlayer,並在完成後釋放()它。好吧... – michelemarcon

0

爲了回答您的評論:

MediaPlayer mp = new MediaPlayer(); 

AssetFileDescriptor descriptor; 

descriptor = getAssets().openFd("track name"); 
mp.setDataSource( descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); 
descriptor.close(); 
mp.setLooping(false); 
mp.prepare(); 
mp.start(); 

您需要到下一次復位並重新設置再次發揮。

相關問題