Java - Hilo Swing

   
Vista:

Hilo Swing

Publicado por Eduardo (144 intervenciones) el 06/08/2014 09:27:23
Hola a todos.

Tengo programado un hilo en java swing con swingworker y no se por qué motivo de vez en cuando da un nullpointerexception.
El hilo descarga correos electrónicos. La funcionalidad la he hecho con la librería javamail.
En el log he visto que el error lo da cuando no está procesando correos.
Incluyo el código del hilo y el error para ver si alguien me puede orientar un poco.
Gracias.

Hilo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
SwingWorker<Void, Void> worker;
        worker = new SwingWorker<Void, Void>()
        {
            @Override
            protected Void doInBackground() throws Exception
            {
                Utilidades.escribeLog("Antes bucle while1");
                while(true)
                {
                    ProcesarCorreos procesarCorreos = new ProcesarCorreos();
 
                    int minuto = Integer.parseInt(Utilidades.getProperty("minutosEsperaDescarga"));
                    int segundo = Integer.parseInt(Utilidades.getProperty("segundosEsperaDescarga"));
 
                    labelTiempo.setText(String.valueOf(minuto) + ":" + String.valueOf(segundo));
 
                    while(minuto != -1 & segundo != 0)
                    {
                        if(segundo == 0)
                        {
                            minuto = minuto - 1;
                        }
                        if(segundo != 0)
                        {
                            segundo = segundo - 1;
                        }
 
                        //Dormimos 1 seg. el hilo para ir decrementando la cuenta atras
                        Thread.sleep(1000);
                        labelTiempo.setText(String.valueOf(minuto) + ":" + String.valueOf(segundo));
                    }
                }
            }
 
            @Override
            protected void done()
            {
                try
                {
                    System.out.println("----------------------------Proceso Interrumpido-----------------------------------------");
                    get();
                }
                catch(Exception e)
                {
                        Utilidades.escribeLog("----INICIO ERROR HILO----");
                        Utilidades.escribeLog(e.getLocalizedMessage());
                        Utilidades.escribeLog(e.getMessage());
                        for(int i=0;i<e.getStackTrace().length;i++)
                        {
                            Utilidades.escribeLog(e.getStackTrace()[i].toString());
                        }
                        Utilidades.escribeLog("----FIN ERROR HILO----");
                }
            }
        };
        worker.execute();



Error:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
java.lang.NullPointerException
java.lang.NullPointerException
java.util.concurrent.FutureTask.report(FutureTask.java:122)
java.util.concurrent.FutureTask.get(FutureTask.java:188)
javax.swing.SwingWorker.get(SwingWorker.java:602)
csiloperacionesedi.interfaz.FrmCSILOperaciones$1.done(FrmCSILOperaciones.java:86)
javax.swing.SwingWorker$5.run(SwingWorker.java:737)
javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:832)
sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112)
javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:842)
javax.swing.Timer.fireActionPerformed(Timer.java:312)
javax.swing.Timer$DoPostEvent.run(Timer.java:244)
java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
java.awt.EventQueue.access$200(EventQueue.java:103)
java.awt.EventQueue$3.run(EventQueue.java:694)
java.awt.EventQueue$3.run(EventQueue.java:692)
java.security.AccessController.doPrivileged(Native Method)
java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Hilo Swing

Publicado por Tom (907 intervenciones) el 06/08/2014 10:11:06
Es difícil verlo, sin tener una idea clara de todo el proceso.

Es casi seguro que la excepción NUllPointerException se esté generando dentro del método doInBackground().

En principio te recomiendo que no uses get() ya que no te hace falta (tu SwingWorker no retorna ningún valor, es Void)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hilo Swing

Publicado por Eduardo (144 intervenciones) el 06/08/2014 10:24:03
Tom, gracias por responder.

Es verdad, no se por qué lo tengo puesto si no devuelve nada.
Yo también creo que el problema está en el método doInBackground pero no se que puede ser porque falla cuando le apetece.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hilo Swing

Publicado por Tom (907 intervenciones) el 06/08/2014 11:12:18
No es fácil manejar los SwingWorker, ya que en realidad son mucho más limitados de lo que parecen.

Otra recomendación es que no actualices labelTiempo desde el doInBackground, ya que podría darte problemas.

La forma "correcta" es invocar publish() (desde doInBackground()) y realizar las actualizaciones en process(), ya que process() se ejecuta en el event thread de swing.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hilo Swing

Publicado por Eduardo (144 intervenciones) el 06/08/2014 14:06:46
Entonces que quito toda la funcionalidad del método doInBackground y la pongo en el metodo process y en doInBackground, pongo solo la llamada a publish.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hilo Swing

Publicado por Tom (907 intervenciones) el 06/08/2014 15:34:36
No. Hay tutoriales por la red si no lo tienes muy claro.

Me refiero a algo como esto (sin entrar en la lógica del programa):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
worker = new SwingWorker<Void, Integer[]>() {
			@Override
			protected Void doInBackground() throws Exception {
				Integer v[] = new Integer[2];
				Utilidades.escribeLog("Antes bucle while1");
				ProcesarCorreos procesarCorreos = new ProcesarCorreos();
 
				while(true) {
					v[0] = Integer.decode(Utilidades.getProperty("minutosEsperaDescarga"));
					v[1] = Integer.decode(Utilidades.getProperty("segundosEsperaDescarga"));
					do {
						publish(v);
						if(v[1] == 0) {
							v[0] = v[0] - 1;
						} else {
							v[1] = v[1] - 1;
						}
						Thread.sleep(1000);
					} while((v[0] != -1) && (v[1] != 0));
				}
			}
			@Override
			protected void process(List<Integer[]> vv) {
				for(Integer[] i : vv) {
					labelTiempo.setText(String.valueOf(i[0]) + ":" + String.valueOf(i[1]));
				}
			}
			@Override
			protected void done() {
				System.out.println("----------------------------Proceso Interrumpido-----------------------------------------");
			}
		};
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hilo Swing

Publicado por Eduardo (144 intervenciones) el 07/08/2014 09:50:51
Hola.
Ya he modificado el código como me lo has puesto.
Lo tengo funcionando y ahora a esperar.
Hay alguna otra manera de hacer este proceso que no sea con swingworker.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hilo Swing

Publicado por Eduardo (144 intervenciones) el 11/08/2014 08:21:15
Hola, acabo de dejar todo el fin de semana el programa funcionando y sigue dando el mismo error. Hay alguna otra manera de hacerlo que sea más fiable que este tipo de hilos.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar