HTTP request congelando GUI

5 respostas
A

Estou sem idéias de como impedir a GUI de congelar enquanto faço um http request, quando clico em um botão na minha tela, o pedido é feito e então um XML é retornado e utilizo ele para preencher um formulario, mas se eu uso uma Thread no pedido para impedir a tela de congelar, o programa continua antes do XML ser retornado, mantendo o document null.

public void actionPerformed(ActionEvent btn){
		if(btn.getSource().equals(screen.getBtnOk1())){
			Player player = setPlayerData(1); //pego o xml e coloco as informaçoes na classe player
			if(player != null)
				setForm(player,1); //uso as informaçoes do player para preencher o formulario

		}

public Player setPlayerData(int i){

		Document doc = null;
		Player player = new Player();
		String nickname = null;

		try {

			if(i == 1){
				nickname = screen.getjComboBox_player1().getSelectedItem().toString();
				doc = HttpRequest.getXml(nickname);
				player1 = player;

			}
			else{
				nickname = screen.getjComboBox_player2().getSelectedItem().toString();
				doc = HttpRequest.getXml(nickname);
				player2 = player;
			}

	        player.setGamesPlayed(Integer.parseInt(PathXml.getValue(doc, "rnk_games_played")));
			player.setAnnihilation(Integer.parseInt(PathXml.getValue(doc, "rnk_annihilation")));
			player.setAssists(Integer.parseInt(PathXml.getValue(doc, "rnk_heroassists")));
			player.setBloodbath(Integer.parseInt(PathXml.getValue(doc, "rnk_ks10")));
			player.setBloodlust(Integer.parseInt(PathXml.getValue(doc, "rnk_bloodlust")));
			player.setChampion(Integer.parseInt(PathXml.getValue(doc, "rnk_ks9")));
			player.setCreepDeny(Double.parseDouble(PathXml.getValue(doc, "rnk_denies"))/player.getGamesPlayed());
			player.setCreepKill(Double.parseDouble(PathXml.getValue(doc, "rnk_teamcreepkills"))/player.getGamesPlayed());
			player.setDeaths(Double.parseDouble(PathXml.getValue(doc, "rnk_deaths")));
			player.setDominating(Integer.parseInt(PathXml.getValue(doc, "rnk_ks8")));
			player.setDoubleTap(Integer.parseInt(PathXml.getValue(doc, "rnk_doublekill")));
			player.setHatTrick(Integer.parseInt(PathXml.getValue(doc, "rnk_triplekill")));
			player.setImmortal(Integer.parseInt(PathXml.getValue(doc, "rnk_ks15")));
			player.setKills(Double.parseDouble(PathXml.getValue(doc, "rnk_herokills")));
			player.setKdr(player.getKills()/player.getDeaths());
			player.setLegendary(Integer.parseInt(PathXml.getValue(doc, "rnk_ks5")));
			player.setLosses(Integer.parseInt(PathXml.getValue(doc, "rnk_losses")));
			player.setMmr(Double.parseDouble(PathXml.getValue(doc, "rnk_amm_team_rating")));
			player.setNickname(PathXml.getValue(doc, "nickname"));
			player.setOnslaught(Integer.parseInt(PathXml.getValue(doc, "rnk_ks6")));
			player.setQuadKill(Integer.parseInt(PathXml.getValue(doc, "rnk_quadkill")));
			player.setSavageSick(Integer.parseInt(PathXml.getValue(doc, "rnk_ks7")));
			player.setSerialKiller(Integer.parseInt(PathXml.getValue(doc, "rnk_ks3")));
			player.setUltimateWarrior(Integer.parseInt(PathXml.getValue(doc, "rnk_ks4")));
			player.setWins(Integer.parseInt(PathXml.getValue(doc, "rnk_wins")));
			double points = calculatePoints(player);
			player.setPoints(points);
	}
package util;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class HttpRequest {
	
	public HttpRequest(){

	}
		   
	public  static Document getXml(String nickname) throws SAXException, IOException, XPathExpressionException, ParserConfigurationException, TransformerException{
		
            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            Document doc = docBuilder.parse("http://xml.heroesofnewerth.com/xml_requester.php?f=player_stats&opt=nick&nick[]="+nickname);
           
            return doc;        
	}
}

5 Respostas

Alexandre_Saudate

Coloque numa thread separada e depois use o método join() da Thread.

[]´s

A

Não funcionou, fiz algo errado?

public Player setPlayerData(int i){

		Document doc = null;
		Player player = new Player();
		String nickname = null;
		HttpRequest request = new HttpRequest();
		try {

			if(i == 1){
				nickname = screen.getjComboBox_player1().getSelectedItem().toString();
				doc = request.getXml(nickname);
				player1 = player;

			}
			else{
				nickname = screen.getjComboBox_player2().getSelectedItem().toString();				
				doc = request.getXml(nickname);
				player2 = player;
			}
            request.getThread().join();
			player.setGamesPlayed(Integer.parseInt(PathXml.getValue(doc, "rnk_games_played")));
			player.setAnnihilation(Integer.parseInt(PathXml.getValue(doc, "rnk_annihilation")));
			player.setAssists(Integer.parseInt(PathXml.getValue(doc, "rnk_heroassists")));
			player.setBloodbath(Integer.parseInt(PathXml.getValue(doc, "rnk_ks10")));
			player.setBloodlust(Integer.parseInt(PathXml.getValue(doc, "rnk_bloodlust")));
			player.setChampion(Integer.parseInt(PathXml.getValue(doc, "rnk_ks9")));
			player.setCreepDeny(Double.parseDouble(PathXml.getValue(doc, "rnk_denies"))/player.getGamesPlayed());
			player.setCreepKill(Double.parseDouble(PathXml.getValue(doc, "rnk_teamcreepkills"))/player.getGamesPlayed());
			player.setDeaths(Double.parseDouble(PathXml.getValue(doc, "rnk_deaths")));
			player.setDominating(Integer.parseInt(PathXml.getValue(doc, "rnk_ks8")));
			player.setDoubleTap(Integer.parseInt(PathXml.getValue(doc, "rnk_doublekill")));
			player.setHatTrick(Integer.parseInt(PathXml.getValue(doc, "rnk_triplekill")));
			player.setImmortal(Integer.parseInt(PathXml.getValue(doc, "rnk_ks15")));
			player.setKills(Double.parseDouble(PathXml.getValue(doc, "rnk_herokills")));
			player.setKdr(player.getKills()/player.getDeaths());
			player.setLegendary(Integer.parseInt(PathXml.getValue(doc, "rnk_ks5")));
			player.setLosses(Integer.parseInt(PathXml.getValue(doc, "rnk_losses")));
			player.setMmr(Double.parseDouble(PathXml.getValue(doc, "rnk_amm_team_rating")));
			player.setNickname(PathXml.getValue(doc, "nickname"));
			player.setOnslaught(Integer.parseInt(PathXml.getValue(doc, "rnk_ks6")));
			player.setQuadKill(Integer.parseInt(PathXml.getValue(doc, "rnk_quadkill")));
			player.setSavageSick(Integer.parseInt(PathXml.getValue(doc, "rnk_ks7")));
			player.setSerialKiller(Integer.parseInt(PathXml.getValue(doc, "rnk_ks3")));
			player.setUltimateWarrior(Integer.parseInt(PathXml.getValue(doc, "rnk_ks4")));
			player.setWins(Integer.parseInt(PathXml.getValue(doc, "rnk_wins")));
			double points = calculatePoints(player);
			player.setPoints(points);
			setNicknames(nickname);

		} catch (XPathExpressionException e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		} catch(NullPointerException e){
			JOptionPane.showMessageDialog(screen, "Jogador não existe");
			return null;
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return player;
	}
package util;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class HttpRequest {
	
	private Thread thread = null;
	private Document doc = null;
	
	public Thread getThread() {
		return thread;
	}

	public HttpRequest(){

	}
		   
	public Document getXml(final String nickname) throws SAXException, IOException, XPathExpressionException, ParserConfigurationException, TransformerException{
		
		thread = new Thread(new Runnable (){
			public void run(){
	         try {
	        	DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();			    
		        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();	          
				doc = docBuilder.parse("http://xml.heroesofnewerth.com/xml_requester.php?f=player_stats&opt=nick&nick[]="+nickname);
			} catch (SAXException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}
			}
		});
		         
		   thread.start();
                return doc;        
	}
}

A GUI trava e o doc volta null.

Alexandre_Saudate

A sua gui trava pq vc esta fazendo algo demorado na thread de eventos. A ideia e que voce crie a thread separada, mostre uma janela de “aguarde” e use o metodo join(). Na sequencia, vc faz o dispose() da tela de aguarde.

[]'s

A

Entendi, então não tem jeito mesmo de manter a tela ativa enquanto estiver fazendo isso?

Alexandre_Saudate

Tem! É só fazer em uma thread separada!

Entenda que a especificação Swing diz que não é aconselhável fazer nada demorado na thread de eventos, já que isso faz travar, mesmo, todo o resto. Então, faça o processamento pesado numa thread separada e depois junte as coisas, só isso.

Criado 2 de fevereiro de 2011
Ultima resposta 2 de fev. de 2011
Respostas 5
Participantes 2