Foros del Web » Programación para mayores de 30 ;) » Programación móvil »

J2ME Error al poner sonido a cronómetro - Out Of Memory Error Java/lang/OutOfMemoryEr

Estas en el tema de J2ME Error al poner sonido a cronómetro - Out Of Memory Error Java/lang/OutOfMemoryEr en el foro de Programación móvil en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 03/12/2013, 20:28
 
Fecha de Ingreso: julio-2011
Mensajes: 1
Antigüedad: 13 años, 4 meses
Puntos: 0
Pregunta J2ME Error al poner sonido a cronómetro - Out Of Memory Error Java/lang/OutOfMemoryEr

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.

Código:
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.


Desde ya muchas Gracias.

Saludos... Gabriel.

Etiquetas: j2me, memory, sonido
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:22.