2016-04-11 9 views
0

Der folgende Code gibt einen zufälligen Ton wieder. Ich versuche es zu veröffentlichen, da ich die Taste nicht mehr brauche, um etwas anderes zu spielen, aber wenn ich die Anwendung starte, wird die Taste überhaupt keinen Ton abspielen.Wie können SoundPool-Objekte ordnungsgemäß freigegeben werden?

public class actibida extends AppCompatActivity { 
SoundPool soundPool; 
Button button; 
boolean loaded = false; 

protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_actibida); 

    soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); 
    soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { 
     @Override 
     public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { 
      loaded = true; 
     } 
    }); 

    //I have a total of four sounds 
    final int[] sound = new int[4]; 
    sound[0] = soundPool.load(actibida.this, R.raw.el, 1); 
    sound[1] = soundPool.load(actibida.this, R.raw.guau, 1); 
    sound[2] = soundPool.load(actibida.this, R.raw.miau, 1); 
    sound[3] = soundPool.load(actibida.this, R.raw.quack, 1); 

    final Random r = new Random(); 

    button = (Button) this.findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View button) { 

      final Random r = new Random(); 
      int Low = 0; 
      int High = 3; 
      int rndm = r.nextInt(High - Low) + Low; 
      soundPool.play(sound[r.nextInt(4)], 1.0f, 1.0f, 0, 0, 1.0f); 


     } 

    }); 
    soundPool.release(); 
     } 
} 

Kann jemand bitte erziehen mich auf, wie man richtig nennen .release()?

P.S. Wenn ich andere Sounds in der App spiele, sollte ich eine andere SoundPool-Klasse verwenden? Oder sollte ich es einfach freigeben und wieder laden? Die Sache ist, dass ich überhaupt nicht in der Lage bin zu veröffentlichen, also kann ich es nicht sagen.

Antwort

0

Sie geben den SoundPool frei, bevor der Sound endet. Tatsächlich geben Sie es in dem Moment frei, in dem die Wiedergabe beginnt. Die Methode play() wartet nicht auf das Ende der Sounds - die Wiedergabe ist asynchron. Außerdem gibt es keine Möglichkeit herauszufinden, wann die Wiedergabe beendet ist.

Wenn Sie in Zukunft aus demselben Pool von Sounds spielen möchten, können Sie den SoundPool einfach zu einer Art Singleton machen oder ihn an einem Ort speichern, an dem er wiederverwendet werden kann.

+0

Ich bearbeitet den Beitrag, so dass jeder den Rest des Codes überprüfen konnte. Ich habe versucht, soundPool.release(); ganz am Ende, aber es funktioniert immer noch nicht. Wo sollte ich es platzieren? – Camilo

+0

Wenn Sie es nach Abschluss der Aktivität nicht verwenden möchten, geben Sie es in onDestroy() frei. –

Verwandte Themen