Problema c/ SwingWorker

1 resposta
B

Galera,

Preciso implementar em minha app. swing uma área capaz de visualizar banners. Consegui uma classe que implementa um browser e resolvi parcialmente meu problema. O q acontece é q preciso trocar de página de 20 em 20 segundos e para isso estou usando SwingWorker:
// Implementa a troca e atualização de notícias	
		SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
			@Override
			protected Void doInBackground() throws Exception {				
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						// Se não houver notícias, seta uma default
						if (listaNoticias.size() == 0) {
							webBrowser.setURL("http://www.xxxxxxx.com.br");
						} else {	
							while (true) {
								trocaNoticias();					
							}
						}
					}
				});
				
				return null;
			}
			
			@Override  
		    public void done() {
				webBrowserPanel.validate();
				webBrowserPanel.repaint();
			}			
		};
Segue abaixo o código do método trocaNoticias() que faz a maior parte do trabalho
/*
	 * Efetua a troca de tempos em tempos entre as notícias da listaNoticias
	 */
	private synchronized void trocaNoticias() {
		final int timeTrocaNot = 5000; // Tempo de troca das notícias
		long timeAtualizNot = 0; // Tempo para atualização das noticias
		for (int i = 0; i < listaNoticias.size(); i++) {
			try {				
				System.out.println("******> Entrou");
				webBrowser.setURL("http://" + listaNoticias.get(i).getUrl());
								
				System.out.println("******> Conte 20 seg");
				Thread.sleep(timeTrocaNot);				
				System.out.println("******> Atualiza");
				System.out.println("********************************************");
				
			} catch (Exception e) {
				e.printStackTrace();
				break;
			}

		}
	}
:arrow: Acontece que está travando toda minha aplicação!!!

1 Resposta

H

O seu problema com certeza está no while(true) que está consumindo
todo o recurso de processamento do seu servidor, a solução para este
problema é você dar uma ‘folga’ para o processador.

Eu vejo duas maneiras de se resolver isso:

try { Thread.sleep(10); } catch(Exception e) { System.out.println("falha no método sleep" + e); }
Ou, você utilizando um temporizador como o quartz , que de tempo em tempos
chamaria o seu método para trocar o banner.

Ou no terceiro caso que eu pensei agora, talvez uma consulta em ajax poderia
resolver o seu problema com mais facilidade, cahamando um método remotamente
na sua aplicação que trocasse somente a área do banner.

Isso na minha opinião.

Espero ter contribuido com você.

Criado 22 de abril de 2008
Ultima resposta 22 de abr. de 2008
Respostas 1
Participantes 2