Acceder

Ver la Versión Completa : Variable static y MediaPlayer


manolazo
28/08/14, 22:58:49
Buenas

Tengo activity_A en donde:


public static MediaPlayer sonido,

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_modosseleccion);
sonido = MediaPlayer.create(this, R.raw.button54);
}



Paso a activity B:

En activity_B hago referencia a la variable static soundClick1 para empezar el sonido


@Override
protected void onResume() {
super.onResume();

if(soundPrefs.getBoolean("sonido", true))
Activity_A.sonido.start();


Cuando entro en la activity_B suena la musica , pero cuando pulso back vuelvo a A y vuelvo a entrar en activity_B , ya no se escucha.


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

if ((keyCode == KeyEvent.KEYCODE_BACK)) {
if(!gameOver){
AlertDialog.Builder alertbox = new AlertDialog.Builder(contexto);
alertbox.setIcon(R.drawable.boton_tick);
alertbox.setTitle(R.string.deseasalir);
alertbox.setPositiveButton(R.string.si, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
gameOver=true;

if(soundPrefs.getBoolean("sonido", true))
ActivityModosSeleccion.sonido.stop();
finish();
}
});



Es decir al parar con stop al salir de B y al volver a entrar en A en resume() con start() ya no funciona.

Alguna idea?

kriogeN
28/08/14, 23:15:35
Si miras la documentación del MediaPlayer verás que después de un stop() tienes que hacer un prepare() antes de poder volver a hacer un start().

Y por cierto, en Android no es bueno usar variables static, si quieres tener una variable accesible desde toda la aplicación usa un Application.

manolazo
29/08/14, 00:39:15
pensé que lo mejor para pasar objetos entre activities era usar parcelable pero para acceder a una variable statica de otra activity no pasaba nada.

De hecho en Android Application Framework FAQ http://developer.android.com/guide/faq/framework.html pone lo siguiente:

How do I pass data between Activities/Services within a single application?

Y una de las formas es a traves de A public static field/method y no dicen que sea malo.

Sin embargo si he leido lo que dices en otros sitios que es mejor evitar variables staticas, ya no se que pensar.

Es que se me ocurrio usar variables static en la activity A , inicializarlas en A y en onDestroy usar release(); en vez de poner en todas las activitys 6 variables MediaPlayer inicializarlas en onResume y en onDestroy liberarlas ya que si no las libero en onDestroy se petaba la memoria en terminales antiguos.

kriogeN
29/08/14, 01:55:24
Para pasar variables si se suelen usar variables estáticas, pero porque van a ser de "consumo inmediato", y sólo cuando son tan grandes que vas a exceder el tiempo de procesamiento del Bundle si las pasases así, aunque no dentro de la propia Activity, sino en una clase propia destinada a eso y que va a ser temporal. Pero bueno, es un rollazo que no viene al caso.

Y yo no te he dicho que crees las 6 MediaPlayer, te he dicho que pongas 1 solo MediaPlayer pero en el objeto Application, porque será de instancia, estará vivo durante toda la ejecución de la app, y será accesible por todas las Activities.