2010-07-08 10 views
8

In questo momento ho due pulsanti. Ognuno deve produrre un suono diverso. In futuro, probabilmente ci saranno circa 8 pulsanti, ma per ora solo due.modo più efficiente per riprodurre un suono quando si fa clic sul pulsante

public class MyActivity extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      final Button btnDrum1 = (Button) findViewById(R.id.btnDrum1); 
      btnDrum1.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        MediaPlayer mp = MediaPlayer.create(this, R.raw.drum1); 
         mp.start(); 
         mp.release(); 
       } 
      }); 

      final Button btnCym1 = (Button) findViewById(R.id.btnCym1); 
      btnCym1.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        MediaPlayer mp = MediaPlayer.create(this, R.raw.cym1); 
          mp.start(); 
          mp.release(); 
       } 
      }); 

     } 
    } 

Originariamente non avevo mp.release() e sarebbe riprodurre il suono correttamente, ma alla fine l'applicazione potrebbe andare in crash a causa di esaurimento della memoria. Ora con mp.release() non si blocca, ma a volte non suona il suono quando si fa clic.

È questo il modo più efficiente per riprodurre un suono quando si fa clic sul pulsante? È estensibile?

risposta

5

Penso che questo sia dovuto al fatto che lo rilasci mentre sta suonando. Crea un MediaPlayer globale per ogni suono e utilizzalo più e più volte, rilascialo quando l'attività è chiusa (forse anche quando è in pausa, e ricarica se riprendi se i file audio sono grandi). Inoltre, dal momento che avrete molti pulsanti, si potrebbe avere un unico onclicklistener su tutti i pulsanti che si crea un'istanza sulla onCreate():

private class MyMagicalOnClickListener implements View.OnClickListener { 
    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
      case R.id.button1: 
      //play sound 1 
      break; 
     case R.id.button2: 
      //play sound 2 
      break; 
     } 
    } 
} 

solo commentare e ditemi se non siete sicuri su come implementare questo :)

modifica: Per richiesta, ecco un'implementazione chiara che dovrebbe fare miracoli con la tua app. Ho fatto in modo che l'attività implementasse onclicklistener invece, penso che sia un po 'più pulito.

public class Bluarg extends Activity implements OnClickListener{ 

    MediaPlayer mp1; 
    MediaPlayer mp2; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mp1 = MediaPlayer.create(this, R.raw.sound1); 
     mp2 = MediaPlayer.create(this, R.raw.sound2); 

     final Button button1 = (Button) findViewById(R.id.button1); 
     button1.setOnClickListener(this); 

     final Button button2 = (Button) findViewById(R.id.button2); 
     button1.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
     case R.id.button1: 
      mp1.start(); 
      break; 
     case R.id.button2: 
      mp2.start(); 
      break; 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     mp1.release(); 
     mp2.release(); 
     super.onDestroy(); 
    } 
} 
+0

Quello che stai descrivendo sembra avere un senso, ma sono un po 'insicuro del modo migliore per implementarlo. – Bromide

+0

lì, ho modificato in un'implementazione. Assicurati solo di capire cosa ho fatto in modo da poterlo usare anche in altre situazioni :) – pgsandstrom

3

Se l'app avrà più pulsanti, è necessario utilizzare SoundPool anziché MediaPlayer. Poiché MediaPlayer rovinerà la memoria della tua app, non potrà più riprodurre suoni.

Questo mi ha aiutato! e penso che lo farai anche tu Play sound with SoundPool

Problemi correlati