2012-07-17 82 views
1

在我的j2me應用程序中,我必須每次用戶點擊一個項目時播放一個小的聲音文件。但問題是,當我播放聲音文件多次,如10-14次後,它給我 內存異常。雖然我每次釋放球員我播放的文件,但仍然是 給出了內存的異常:這裏是代碼片段,j2me應用程序內存異常多時間文件播放

public void playSound(String soundFile) { 
    try{ 
     if (player!=null) { 
      try { 
       player.deallocate(); //deallocate the unnecessary memory. 
      } catch (Exception ex) { 
       player=null; 
       System.gc(); 
      } 
     } 

     player = Manager.createPlayer(getClass().getResourceAsStream(musicFolder + soundFile), "audio/mpeg"); 
     // player = Manager.createPlayer(is, "audio/mpeg"); 
     player.realize(); 

     // get volume control for player and set volume to max 
     VolumeControl vc = (VolumeControl) player.getControl("VolumeControl"); 
     if (vc != null) { 
      vc.setLevel(100); 
     } 

     player.prefetch(); 
     player.start(); 
     isException=false; 
    } catch (Exception e) { 

     isException=true; 
    } 
} 

有人能告訴我什麼錯誤?

+0

請添加手機制造商和型號。另外,在代碼中指出你確實知道哪一行代碼會拋出什麼java.lang.Throwable – 2012-07-17 13:04:20

+0

諾基亞Asha 305設備 – user1001084 2012-07-17 13:43:34

回答

0

我不知道爲什麼解除分配不起作用。我想這要麼需要更長的時間去分配比創建一個新的,或解除分配由於某種原因失敗。是否有player.stop()匹配player.start()?

另一件嘗試(如果沒有別的,對於好的形式:)不是創造新的球員,除非你需要/應該。即移動

if(player!=null){ 

所以它也涵蓋

player = Manager.createPlayer(getClass().getResourceAsStream(musicFolder + soundFile), "audio/mpeg"); 

HTH!

2

我想你也應該調用

player.close() 

player.deallocate(); 

權後,根據文件 「當DEALLOCATE返回後,Player處於未實現或REALIZED狀態。」但接近更遠......「當方法返回時,播放器處於CLOSED狀態,不能再使用。」

3

三件事情要記住

  • 如果你要玩同樣的聲音幾次,你可能想保留一個播放器預取,只是啓動它多次。

  • 當你要正確地清理一個球員,你應該叫Player.close()

  • 您可能需要使用一個媒體事件監聽器關閉和/或獨立用戶輸入的重新啓動播放器。

相關問題