2015-10-20 70 views
0

我有一個活動,點擊一個按鈕隨機選擇一個單詞並播放它的聲音。它來自單詞列表,以及「res」部分中對應的「原始」聲音子文件夾。它適用於六十或七十次點擊,但不會播放聲音 - 儘管它不會崩潰。這是「聲音溢出」的問題嗎?也許我不能正確管理mediaplayer mp?這裏是相關代碼聲音溢出?

public String randomWord(){ 
    boolean OK; 
    OK = false; 

    while (!OK) { 

     Random rand = new Random(); 

     numeroAuHasard = 5 + rand.nextInt(nombreDeMots-5); 
     // nombre aléatoire entre 5 et 175 (si nombreDeMots == 176) 

     mysteryWord = listeDesMots.get(numeroAuHasard); 

     if (mysteryWord.charAt(mysteryWord.length() - 1) == '1') // je veux que le mot se termine par '1' 
     { 
      OK = true; 
     } 

     for (int i = 0; i<mysteryWord.length();i++){ 
      if(mysteryWord.charAt(i) == '_'){// je veux que le mot ne contienne pas '_' 
       OK = false; 
      } 
     } 
    } 

    // mysteryWord = "francois1"; // pour test de check "ç" 

    return mysteryWord; 
} 


// bouton qui sélectionne un mot au hasard et le joue 
public void listen(){ 
    final Button boutonGenerique = (Button) findViewById(R.id.listen); 
    final TextView monMessage = (TextView) findViewById(R.id.zone_trado_scrollable); 
    final TextView maReponse = (TextView) findViewById(R.id.reponse); 

    View.OnClickListener monEcouteur = new View.OnClickListener() { 
     public void onClick(View v) { 

      // remise à zéro des deux champs 
      monMessage.setText(""); 
      maReponse.setText(""); 

      // sélection d'un mot au hasard 
      marcel = randomWord(); 

      // important de mettre ceci à l'intérieur du listener, 
      // car c'est recréé avec une nouvelle ressource chaque fois qu'on clique 
      final int resRaw = getResources().getIdentifier(marcel, "raw", getPackageName()); 
      final MediaPlayer mp = MediaPlayer.create(SpellingActivity.this, resRaw); 


      if (marcel == "off1"){ 
       monMessage.setText(Html.fromHtml("<i>caveat: this is the word with two consonants</i>")); 
      } 

      // on joue le mot 
      mp.start(); 
     } 
    }; 
    boutonGenerique.setOnClickListener(monEcouteur); 
} 

回答

1

從代碼看來,您每次單擊按鈕時都會創建MediaPlayer的新實例。聲音完成後釋放媒體播放器,並在下次單擊該按鈕時重新創建。更好的是,嘗試創建一個媒體播放器單例,以便您只有一個媒體播放器實例。

查看帖子here

+0

我按照你的建議。我添加了公共靜態MediaPlayer mp;在類的開始處,以及在listen()方法中,媒體播放器僅用mp = MediaPlayer.create(SpellingActivity.this,resRaw)調用;它的工作。謝謝。 – Andy