[AYUDA] Error al poner sonido a cronómetro - Out Of Memory Error Java/lang/OutOfMemoryError

26.097 0
 #1
Escrito   0  0  
Hola

Soy nuevo en la programación con J2ME, la intención es hacer algo que me pareció muy simple, un pequeño cronómetro utilizando un Timer que se ejecute cada 1 segundo, pero cuando cambie que solamente ejecute un pequeño archivo de sonido, el cual es un wav de 13k

Si hago funcionar el cronómetro sin el sonido anda perfecto, pero cuando le agrego la parte del sonido lo ejecuta solamente 7 veces, luego deja de ejecutar el sonido pero el contador sigue funcionando normalmente durante 2 a 4 minutos. Seguidamente tira un Error de Aplicación y cuando le doy en detalles me figura "Out Of Memory Error Java/lang/OutOfMemoryError"

Les adjunto el código completo para que me puedan ayudar a encontrar el error.

code:
package cronometro;

import java.io.InputStream;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.media.Manager;
import javax.microedition.media.Player;

public class cronometro extends MIDlet implements CommandListener {
    private Form formulario;
    private Display pantalla;
    private Command cmdIniciar;
    private Command cmdSalir;
    private Command cmdParar;
    private Command cmdReiniciar;
    private TextField txtVisor;
    public Crono crono;
    
    public cronometro(){
        pantalla = Display.getDisplay(this);
        formulario = new Form("Cronómetro 1.0");
        cmdIniciar = new Command("Iniciar", Command.OK, 0);
        cmdSalir = new Command("Salir", Command.EXIT, 1);
        cmdParar = new Command("Parar", Command.STOP, 0);
        cmdReiniciar= new Command("Reiniciar", Command.OK, 1);
        txtVisor = new TextField("Cronómetro", "00:00:00:00", 15, TextField.ANY);
        formulario.addCommand(cmdSalir);
        formulario.addCommand(cmdIniciar);
        formulario.setCommandListener(this);
        formulario.append(txtVisor);
    }

    public void startApp() {
        pantalla.setCurrent(formulario);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
    
    public void commandAction(Command c, Displayable d){
        if (c==cmdSalir){
            destroyApp(false);
            notifyDestroyed();
        }
        else if (c==cmdIniciar){
            crono = new Crono(txtVisor);
            crono.Iniciar();
            formulario.removeCommand(cmdIniciar);
            formulario.removeCommand(cmdSalir);
            formulario.addCommand(cmdParar);
            formulario.addCommand(cmdReiniciar);
            formulario.setCommandListener(this);
        }
        else if (c==cmdParar){
            crono.Parar();
            formulario.removeCommand(cmdParar);
            formulario.removeCommand(cmdReiniciar);
            formulario.addCommand(cmdSalir);
            formulario.addCommand(cmdIniciar);
            formulario.setCommandListener(this);
        }
        else if (c==cmdReiniciar){
            crono.Parar();
            crono = new Crono(txtVisor);
            crono.Iniciar();
        }
    }
}

class Crono extends TimerTask implements Runnable {

//class Crono extends TimerTask {

    private long contador = 0;
    private Timer timerVelocidad;
    private TextField txt;
    public Player soundPlayer;
    private Display pantalla;
    private TextField TextField;

    public Crono(TextField t){
        txt = t;
    }

    public void run(){
        contador = contador + 100;
        playWav();
        txt.setString(DameFormatoHora(contador));
    }
    
    public void Iniciar(){
        contador = 0;
        timerVelocidad = new Timer();
        timerVelocidad.schedule(new Crono(txt), 0, 1000);
    }
    
    public void Parar(){
        timerVelocidad.cancel();
    }
    
    public String DameFormatoHora(long millis){
        String Hora;
        long centesimas, segundos, minutos, horas;
        centesimas = millis % 100;
        segundos = (millis/100) % 60;
        minutos = (millis/100) /60;
        minutos = minutos %60;
        horas = (((millis/100)/60)/60);
        
        if (horas<10)
            Hora = "0" + horas + ":";
        else
            Hora = horas + ":";
        
        if (minutos<10)
            Hora = Hora + "0" + minutos + ":";
        else
            Hora = Hora + minutos + ":";
        
        if (segundos<10)
            Hora = Hora + "0" + segundos + ":";
        else
            Hora = Hora + segundos + ":";
        
        if (centesimas<10)
            Hora = Hora + "0" + centesimas;
        else
            Hora = Hora + centesimas;
        
        return Hora;
    }
    
    
        public void playWav() {
        try {
            InputStream is = getClass().getResourceAsStream("sonido.wav");
            soundPlayer = Manager.createPlayer(is, "audio/x-wav");
            soundPlayer.start();
        } catch (Exception e) {
            Alert alr = new Alert("Error", "No se pudo reproducir el sonido.", 
                                   null, AlertType.ERROR);
            alr.setTimeout(Alert.FOREVER);
        }
    }

}


Lo que noto al correr el programa con el Debug es que cada vez que se ejecuta el sonido es como que me generase un nuevo Thread y lo pone como suspendido. Si lo ejecuto sin el sonido eso no lo hace.

Adjunto una imagen del debugging

Desde ya muchas Gracias.

Saludos... Gabriel.
Volver a JAVA