Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Douglas Tondo

Problemas com Threads (JavaME)

Recommended Posts

opa, estou com um probleminha de threads...

 

Eu tenho que conectar com o servidor e ele tenque me dar uma resposta. Só que o código não pode continuar até receber uma resposta do servidor...

 

não estou conseguindo fazer o programa esperar até o servidor devolver a resposta...

 

ja tentei wait().... t.join, setar uma buleana como false, e no meio do run() setar ela true quando acabou de executar o que eu queria... e não teve geito...

 

alguma idéia?

 

....
 //seta na classe getXml os atributos necessários para a conexao
 getXml.setAll(xmlGetViewDataRequest, midlet, "post");
 // depois de todos parâmetro setados faz a conexão.
 getXml.startConnection();
 //É NESSE MEIO QUE O CODIGO TENQUE PARAR ...porque ele tenque pegar do servidor a resposta antes de executar o metodo abaixo... e isso, com as threads eu nao to conseguindo...
 manipulaXml(getXml.getXmlProcessed());
...


.....
public void startConnection() {
		Thread t = new Thread(this);
		//t.start chama, em baixo nível, o "run".
		t.start();
		// interrompe a execução do código. Quando "run" acabar de executar
		// o código continua o seu fluxo. Isso indica que a thread acabou, pois
		// ela termina com no final de "run".
		try {
			t.join();
		} catch (InterruptedException ex) {
			Alert b = new Alert("erro no try",
				   "ex", null, AlertType.ERROR);
			b.setTimeout(10000);
		}
	}

	public void setAll(String xmlRequest, CentaurusMidlet midlet, String getOrPost) {
		this.xmlRequest = xmlRequest;
		this.getOrPost = getOrPost;
		this.midlet = midlet;
	}

	public String getXmlProcessed() {
		return xmlProcessed;
	}
	//String xmlRequest,CentaurusMidlet midlet, String getOrPost
	public void run() {
		// se for get entra nesse metodo
		if (getOrPost.equalsIgnoreCase("get")) {
			//se nao entra no "else(POST)"
			try {
				connection = (HttpConnection) Connector.open("http://192.168.0.51/" +
						"centaurusweb/centaurusweb.dll/XMLgetViewData");
				code = connection.getResponseCode();
				if (code == HttpConnection.HTTP_OK) {
					iStream = connection.openInputStream();
					int length = (int) connection.getLength();
					if (length > 0) {
						dataReceve = new byte[length];
						int totalBytes = 0;
						int bytesRead = 0;
						while ((totalBytes < length) | (bytesRead > 0)) {
							bytesRead = iStream.read(
									dataReceve, totalBytes, length - totalBytes);
							if (bytesRead > 0) {
								totalBytes += bytesRead;
							}
						}
					}
					xmlProcessed = new String(dataReceve);
				//	autenticaXml(xmlGeneric); // verica se o login deu ok
				} else {
					//System.out.print("Erro na Conexao");
					Alert b = new Alert("Centaurus Mobile",
							"Erro de conexão: HTTP_OK or GET not possible", null, AlertType.ERROR);
					b.setTimeout(3000);
					//  midlet.setCommandListener(this);
					midlet.display.setCurrent(b);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			if (getOrPost.equalsIgnoreCase("post")) {
				try {		//ctkey=1354101C190009060B03095849535E4D57585B0454
					connection = (HttpConnection) Connector.open("http://192.168.0.51/" +
							"centaurusweb/centaurusweb.dll/XMLgetViewData");
					connection.setRequestMethod(HttpConnection.POST);
					oStream = connection.openOutputStream();
					int xmlLength = xmlRequest.length();
					if (xmlLength > 0) {
						// dataSend tem o tamanho do xml a ser enviado...
						dataSend = new byte[xmlLength];
						// dataSend recebe o xmlRequest para ser enviado
						dataSend = xmlRequest.getBytes("UTF-8");
						oStream.write(dataSend);
						oStream.flush();

					}
					code = connection.getResponseCode();
					if (code != HttpConnection.HTTP_OK) {
						throw new IOException("HTTP response code: " + code);
					}

					iStream = connection.openInputStream();
					int receveLength = (int) connection.getLength();
					if (receveLength > 0) {
						dataReceve = new byte[receveLength];
						int totalBytes = 0;
						int bytesRead = 0;
						while ((totalBytes < receveLength) | (bytesRead > 0)) {
							bytesRead = iStream.read(
									dataReceve, totalBytes, receveLength - totalBytes);
							if (bytesRead > 0) {
								totalBytes += bytesRead;
							}
						}
					}
					// guarda a xml recebida em xmlGeneric, que será
					// retornada no final do metodo para a classe que a chamou
					xmlProcessed = new String(dataReceve);
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					try {
						//notify();
						//observer o que isso faz: nada...
						if (iStream != null) {
							iStream.close();
						}
						if (oStream != null) {
							oStream.close();
						}
						if (connection != null) {
							connection.close();
						}
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
.....

codigo completo...

 

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.*;
import nanoxml.*;
import java.util.Vector;

public class CentaurusMidlet extends MIDlet implements CommandListener {

	Display display;
	List form;
	private boolean isPaused;
	//verifica se o visor é ou não colorido
	public boolean isColor;// = display.isColor();
	//verifica a quantidade de cores que o display do celular tem
	public int numColors;// = display.numColors();
	Command exitCommand = new Command("Exit", Command.EXIT, 1);
	TextBoxTB itemName = new TextBoxTB("Nome do item", "", 64, 0, this);
	Login loginScreen = new Login("Bem-vindo ao Centaurus Mobile", this);
	Contatos menuContatos = new Contatos("", this);
	Menu menu = new Menu(this);

	public CentaurusMidlet() {
		form = new List("Centarus Login", List.IMPLICIT);
		//form.addCommand(exitCommand);
		//form.append("List Item #3", null);
		form.setCommandListener(this);
	}

	public void showScreen(String screen) {
		//mostra o objeto especificado
		if (screen.equalsIgnoreCase("menu")) {
			display.setCurrent(menu);
		}
		if (screen.equalsIgnoreCase("contatos")) {
			display.setCurrent(menuContatos);
		}
	}

	public void startApp() {
		if (display == null) {
			display = Display.getDisplay(this);
			display.setCurrent(loginScreen); // comentei pra iniciar direto do canvas
		//display.setCurrent(menu);
		//display.setCurrent(menuContatos);
		}
		isPaused = false;
	}

	public void pauseApp() {
		isPaused = true;
	}

	public boolean isPaused() {
		return isPaused;
	}

	public void destroyApp(boolean unconditional) {
	}

	protected void Quit() {
		destroyApp(true);
		notifyDestroyed();
	}

	public void commandAction(Command c, Displayable d) {
		if (c == exitCommand) {
			destroyApp(true);
			notifyDestroyed(); // Exit
		}
	}
}

class Menu extends Canvas implements CommandListener {

	private Command exitCommand = new Command("Exit", Command.EXIT, 0);
	private Command selectCommand = new Command("Selecionar", Command.ITEM, 0);
	private CentaurusMidlet midlet;
	private int n = 4; //numero de ícones.
	private int iconesPorLinha = 2;
	private int iconesPorColuna = 2;
	public int nPos = 1;
	CreateImage criarImagem = new CreateImage("");
	public int widthScreen = getWidth();
	public int heightScreen = getHeight();
	public int halfWidthIcon = 12;
	public int halfHeightIcon = 12;

	public Menu(CentaurusMidlet midlet) {
		this.midlet = midlet;
		//this.text = text;
		addCommand(exitCommand);
		addCommand(selectCommand);
		setCommandListener(this);
	}

	protected void paint(Graphics h) {
		// Seta Branco
		h.setColor(255, 255, 255);
		// Faz um retangulo 100% da telea branco
		h.fillRect(0, 0, widthScreen, heightScreen);
		paintSelected(h, nPos);
	}

	int posXIconCenter(int pos) {
		return (widthScreen / (iconesPorLinha + 1)) * (((pos - 1) % iconesPorLinha) + 1);
	}

	int posYIconCenter(int pos) {
		return (heightScreen / (iconesPorColuna + 1)) * (((pos - 1) / iconesPorLinha) + 1);
	}

	private void paintSelected(Graphics g, int p) {
		int iconWidth = 50;
		int iconHeight = 50;
		int selectBorderWidth = 4;

		g.setColor(118, 238, 0);
		g.fillRect(posXIconCenter(p) - (iconWidth / 2 + selectBorderWidth),
				posYIconCenter(p) - (iconHeight / 2 + selectBorderWidth),
				iconWidth + 2 * selectBorderWidth,
				iconHeight + 2 * selectBorderWidth);

		criarImagem.loadPath("/imagens/contatos.png");
		g.drawImage(criarImagem.img, posXIconCenter(1), posYIconCenter(1), Graphics.HCENTER | Graphics.VCENTER);
		criarImagem.loadPath("/imagens/agenda.png");
		g.drawImage(criarImagem.img, posXIconCenter(2), posYIconCenter(2), Graphics.HCENTER | Graphics.VCENTER);
		criarImagem.loadPath("/imagens/graficos.png");
		g.drawImage(criarImagem.img, posXIconCenter(3), posYIconCenter(3), Graphics.HCENTER | Graphics.VCENTER);
		criarImagem.loadPath("/imagens/configuracoes.png");
		g.drawImage(criarImagem.img, posXIconCenter(4), posYIconCenter(4), Graphics.HCENTER | Graphics.VCENTER);
	}

	protected void keyPressed(int keyCode) {
		switch (getGameAction(keyCode)) {
			case LEFT:
				if (nPos > 1) {
					nPos--;
				}
				break;
			case UP:
				if (nPos > 2) {
					nPos = nPos - iconesPorLinha;
				}
				break;
			case DOWN:
				if (nPos < 3) {
					nPos = nPos + iconesPorLinha;
				}
				break;
			case RIGHT:
				if (nPos < 4) {
					nPos++;
				}
				break;
		}
		// we wantto show the result, so we ask the canvas to repaint
		repaint();
	//paintSelected(j, nPos);
	}

	private void selectedIcon(int pos) {
		switch (pos) {
			//o midlet ja tinha declarado o menuContatos, entao vamos usar o display dele mesmo;
			case 1:
				midlet.showScreen("contatos");
				break;
			case 2:
				midlet.showScreen("agenda");
				break;
			case 3:
				midlet.showScreen("graficos");
				break;
			case 4:
				midlet.showScreen("config");
				break;
		}
	}
	// this method is for devices with pointers (PDAs)
	protected void pointerDragged(int x, int y) {
	// m_y = y;
	//  m_x = x; // pra caneta
	//  repaint();
	}

	public void commandAction(Command c, Displayable d) {
		if (c == exitCommand) {
			midlet.Quit();
		}
		if (c == selectCommand) {
			selectedIcon(nPos);
		}
	}
}

class CreateImage extends Form {

	public Image img;

	public CreateImage(String title) {
		super(title);
	}

	public void loadPath(String path) {
		// Função usada pra montar uma imagem
		try {
			img = Image.createImage(path);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

class Contatos extends Form implements CommandListener {

	private GetXml getXml = new GetXml();
	private CentaurusMidlet midlet;
	private List searchResult = new List("Pesquisa: ", List.IMPLICIT);
	
	private Form editDetails = new Form("Editar");
	private Command cmEditContatos = new Command("Editar", Command.ITEM, 0);
	
	private Command cmSearch = new Command("Procurar", Command.ITEM, 0);
	private Command cmBackMenu = new Command("Voltar ao Menu", Command.BACK, 0);
	private Command cmBackToListedSearch = new Command("Voltar", Command.BACK, 0);
	private Command cmSeeSearchDetails = new Command("Detalhes", Command.ITEM, 0);
	private Command cmBackToSearch = new Command("Pesquisar Novamente", Command.BACK, 0);//ver aqui to continuel
	private TextField searchBox = new TextField("Pesquisar Contato:", "", 64, TextField.ANY);
	private ChoiceGroup choiceSearch = new ChoiceGroup("Filtrar por", Choice.POPUP);
	public int pagesize = 10;
	public int searchResultSelectedIndex;
	//private GetXml getXml = new GetXml();
	private ParseXml parseXml = new ParseXml();
	//private String xmlGetViewDataRequest = "";
	public String procura;
	public String xmlProcessed;

	public Contatos(String title, CentaurusMidlet midlet) {
		super(title);
		this.midlet = midlet;
		setCommandListener(this);
		criaPesquisa();
	}

	public void criaPesquisa() {
		this.addCommand(cmSearch);
		this.addCommand(cmBackMenu);
		this.append(searchBox);
		this.choiceSearch.append("Nome", null);
		this.choiceSearch.append("Empresa", null);
		this.choiceSearch.append("Telefone", null);
		this.choiceSearch.append("Endereço", null);
		this.append(choiceSearch);
	//this.searchResult.setSelectCommand(cmBackToSearch);
	}

	public void commandAction(Command c, Displayable s) {
		if (c == cmSearch) {
			//monta a pesquisa para que ela seja emcapsualda em xml e processada
			// pelo servidor
			montaPesquisa();
		// midlet.display.setCurrent(searchResult);
		}
		if (c == cmSeeSearchDetails) {
			//mostra os todos os dados do contato
			searchResultSelectedIndex = searchResult.getSelectedIndex();
			midlet.display.setCurrent(editDetails);
			//searchResult.deleteAll();
			mostraDetalhes();
		}
		if (c == cmBackMenu) {
			// midlet.display.setCurrent(midlet.menu);
			midlet.showScreen("menu");
		}
		if (c == cmBackToSearch) {
			//deleteAll();
		   // choiceSearch.deleteAll();
			//	searchResult.deleteAll();
			//removeCommand(cmBackToSearch);
			//removeCommand(cmBackToListedSearch);

			///criaPesquisa();
			//searchResult.removeCommand(cmBackToListedSearch);
			//midlet.menuContatos = new Contatos("",midlet);
			midlet.display.setCurrent(midlet.menuContatos);
		}
		if (c == cmBackToListedSearch) {
			midlet.display.setCurrent(searchResult);
		}

	}

	public void montaPesquisa() {
		//Escolhe qual é o tipo de pesquisa //*POR ENQUANTO DESATIVADO**/
		switch (choiceSearch.getSelectedIndex()) {
			case 1: //Nome
				break;
			case 2: //Empresa
				break;
			case 3: //Telefone
				break;
			case 4: //Endereço
				break;
		}
		//procura = searchBox.getString().trim();
		procura = "maria";
		//passa a string de conexao para contatos
		String xmlGetViewDataRequest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
				// passa a chave recebida do login, e indica a view para abrir "-12"
				"<XMLgetViewDataRequest ctkey=\"" + midlet.loginScreen.ctkey + "\" viewid=\"-12\" " +
				//pagesize diz quantos registros retornar, e pagenumber, quantas paginas visualizar
				//lembrando que pagenumber é -1 até chegar na penultima pagina
				"pagesize=\"" + pagesize + "\" pagenumber=\"1\"><drilldown></drilldown>" +
				"<filters>" +
				"<filter type=\"USER\">" +
				"<PARAMS fieldname=\"contato\" logicaloperator=\"AND \" negated=\"no\" " +
				"level=\"0\" operator=\"contém\">" +
				// pesquisa pelo campo desejado
				"<VALUE><![CDATA[" + procura + "]]></VALUE>" +
				"</PARAMS>" +
				"</filter>" +
				"</filters>" +
				"</XMLgetViewDataRequest>";
		//se não tiver nada no textbox de pesquisa
		if (procura.length() == 0) {
			Alert noString = new Alert("Erro",
					"Digite algo para pesquisar", null, AlertType.ERROR);
			// noString.setTimeout(Alert.FOREVER);
			//  midlet.setCommandListener(this);
			//Command cmOK = new Command("DONE", Command.OK, 0);
			midlet.display.setCurrent(noString);
		} else {
			//passa a consulta xml na variavel String "xmlGetViewDataRequest" 
			//o midlet e o metodo de acesso, no caso post.
			getXml.setAll(xmlGetViewDataRequest, midlet, "post");
			// depois de todos parâmetro setados faz a conexão.
			getXml.startConnection();
			//pega o xml processado pela conexao para montar a pesquisa.
			manipulaXml(getXml.getXmlProcessed());

			midlet.display.setCurrent(searchResult);
		}
	}

	public void manipulaXml(String receivedXml) {
		//limpa os objetos antigos da tela
		searchResult.deleteAll();
		//aqui são setados comandos para o parser do xml
		//Criando o parse (arvore) por meio da xml recebida
		parseXml.createParse(receivedXml);
		//Pesquisa na xml o nome do contato
		//cria-se um vetor dizendo os nívels do xml que quero entrar p/ fazer a consulta
		//esse é o metodo mais rapido para fazê-la
		Vector v = new Vector(3);
		v.addElement("datapacket");
		v.addElement("recorddata");
		//v.addElement("row");
		kXMLElement t, child;
		// Metodo recursivo que pesquisa em um parse os níveis dejesados.
		child = parseXml.findChild(parseXml.root, v);
		//se há algum contato entao 
		try {
			//faz uma pesquisa no parse para mostrar na tela
			for (int i = 0; i < pagesize; i++) {
				t = (kXMLElement) child.getChildren().elementAt(i);

				t = (kXMLElement) t.getChildren().elementAt(1);
				searchResult.insert(i, t.getContents().trim(), null);
			}
			//mostra o resultado da pesquisa registrado em uma LIST
			searchResult.setCommandListener(this);
			searchResult.addCommand(cmSeeSearchDetails);
			searchResult.addCommand(cmBackToSearch);
		} catch (Exception e) {
			Alert resultado = new Alert("Centaurus Mobile",
					"Nenhum resultado encontrado", null, AlertType.ERROR);
			resultado.setTimeout(3000);
			midlet.display.setCurrent(resultado);
		}
	}

	public void mostraDetalhes() {
		//limpa a tela
		editDetails.deleteAll();
		editDetails.addCommand(cmBackToListedSearch);
		editDetails.addCommand(cmEditContatos);
		editDetails.setCommandListener(this);
		//indica os níveis para pesquisar no parse
		Vector v = new Vector(3);
		v.addElement("datapacket");
		v.addElement("recorddata");
		//v.addElement("row");
		kXMLElement t, child;
		child = parseXml.findChild(parseXml.root, v);
		//item selecionado para entrar na pesquisa detalhada
		child = (kXMLElement) child.getChildren().elementAt(searchResultSelectedIndex);

		t = (kXMLElement) child.getChildren().elementAt(0);
		if (t.getContents() != null) {
			StringItem siEmpresa = new StringItem("Empresa: ", t.getContents().trim(), Item.PLAIN);
			editDetails.append(siEmpresa);
		}
		t = (kXMLElement) child.getChildren().elementAt(1);
		if (t.getContents() != null) {
			StringItem siNome = new StringItem("Nome: ", t.getContents().trim(), Item.PLAIN);
			editDetails.append(siNome);
		}
		t = (kXMLElement) child.getChildren().elementAt(2);
		if (t.getContents() != null) {
			StringItem siCargo = new StringItem("Cargo: ", t.getContents().trim(), Item.PLAIN);
			editDetails.append(siCargo);
		}
		t = (kXMLElement) child.getChildren().elementAt(3);
		if (t.getContents() != null) {
			StringItem siTelefone = new StringItem("Telefone: ", t.getContents().trim(), Item.PLAIN);
			editDetails.append(siTelefone);
		}
		t = (kXMLElement) child.getChildren().elementAt(4);
		if (t.getContents() != null) {
			StringItem siEmail = new StringItem("E-mail: ", t.getContents().trim(), Item.PLAIN);
			editDetails.append(siEmail);
		}
		t = (kXMLElement) child.getChildren().elementAt(5);
		if (t.getContents() != null) {
			StringItem siEndereco = new StringItem("Endereço: ", t.getContents().trim(), Item.PLAIN);
			editDetails.append(siEndereco);
		}
	}

	public void alteraDadosEmContatos(String rowToUpdate, String insertOrUpdate,
			int searchResultSelectedIndex) {
		rowToUpdate = getXml.getXmlProcessed();
		if (insertOrUpdate.equalsIgnoreCase("insert")) {
			String xmlPostEntryDataRequest = "< XMLpostEntryDataRequest " +
					"ctkey=\"" + midlet.loginScreen.ctkey + "\" entryid=\"-28\" " +
					"opeartion=\"" + insertOrUpdate + "\">" +
					"<datapacket**>" +
					"</ XMLpostEntryDataRequest >";
		} else if (insertOrUpdate.equalsIgnoreCase("update")) {
			String xmlPostEntryDataRequest = "< XMLpostEntryDataRequest " +
					"ctkey=\"" + midlet.loginScreen.ctkey + "\" entryid=\"-28\" " +
					"opeartion=\"" + insertOrUpdate + "\">" +
					"<datapacket version=\"2,000\" datapacket=\"datapacket\">" +
						"<metadata fielddefs=\"yes\" indexdefs=\"no\" recorddata=\"yes\" changes=\"no\">" +
							"<fielddefs count=\"9\">"+
								"<fielddef name=\"contato\" fsize=\"50\" displaylabel=\"Nome Contato\" displaywidth=\"20\"/>"+
								"<fielddef name=\"fone\" fsize=\"25\" displaylabel=\"Fone Contato\" displaywidth=\"16\"/>"+
								"<fielddef name=\"email\" fsize=\"60\" displaylabel=\"E-Mail Contato\" displaywidth=\"33\"/>"+
								"<fielddef name=\"data_inclusao\" datatype=\"datetime\" displaylabel=\"Data Inclusão\" editmask=\"!99/99/0000;1;_\" displaywidth=\"18\" readonly=\"true\"/>"+
								"<fielddef name=\"cdempresa\" datatype=\"int\" visible=\"false\" required=\"true\" align=\"right\"/>"+
								"<fielddef name=\"cdcontato\" datatype=\"int\" visible=\"false\" align=\"right\"/>"+
							"</fielddefs>" +
						"</metadata>"+
					"<recorddata count=\"1\">"+
			"<row>" +
					 rowToUpdate +
						"</row>" +
					"</recorddata>"+
					"</datapacket>" +
					"</ XMLpostEntryDataRequest >";
		}
	}
}

class GetXml implements Runnable {

	private CentaurusMidlet midlet;
	HttpConnection connection = null;
	InputStream iStream = null;
	OutputStream oStream = null;
	byte[] dataReceve = null;
	byte[] dataSend = null;
	int code;
	//variaveis responsávels por entradas e retornos.
	String xmlRequest; //xml do post
	String getOrPost; // para ver se é post ou get
	String xmlProcessed; //xml da resposta do servidor

	public void startConnection() {
		Thread t = new Thread(this);
		//t.start chama, em baixo nível, o "run".
		t.start();
		// interrompe a execução do código. Quando "run" acabar de executar
		// o código continua o seu fluxo. Isso indica que a thread acabou, pois
		// ela termina com no final de "run".
		try {
			t.join();
		} catch (InterruptedException ex) {
			Alert b = new Alert("erro no try",
				   "ex", null, AlertType.ERROR);
			b.setTimeout(10000);
		}
	}

	public void setAll(String xmlRequest, CentaurusMidlet midlet, String getOrPost) {
		this.xmlRequest = xmlRequest;
		this.getOrPost = getOrPost;
		this.midlet = midlet;
	}

	public String getXmlProcessed() {
		return xmlProcessed;
	}
	//String xmlRequest,CentaurusMidlet midlet, String getOrPost
	public void run() {
		// se for get entra nesse metodo
		if (getOrPost.equalsIgnoreCase("get")) {
			//se nao entra no "else(POST)"
			try {
				connection = (HttpConnection) Connector.open("http://192.168.0.51/" +
						"centaurusweb/centaurusweb.dll/XMLgetViewData");
				code = connection.getResponseCode();
				if (code == HttpConnection.HTTP_OK) {
					iStream = connection.openInputStream();
					int length = (int) connection.getLength();
					if (length > 0) {
						dataReceve = new byte[length];
						int totalBytes = 0;
						int bytesRead = 0;
						while ((totalBytes < length) | (bytesRead > 0)) {
							bytesRead = iStream.read(
									dataReceve, totalBytes, length - totalBytes);
							if (bytesRead > 0) {
								totalBytes += bytesRead;
							}
						}
					}
					xmlProcessed = new String(dataReceve);
				//	autenticaXml(xmlGeneric); // verica se o login deu ok
				} else {
					//System.out.print("Erro na Conexao");
					Alert b = new Alert("Centaurus Mobile",
							"Erro de conexão: HTTP_OK or GET not possible", null, AlertType.ERROR);
					b.setTimeout(3000);
					//  midlet.setCommandListener(this);
					midlet.display.setCurrent(b);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			if (getOrPost.equalsIgnoreCase("post")) {
				try {		//ctkey=1354101C190009060B03095849535E4D57585B0454
					connection = (HttpConnection) Connector.open("http://192.168.0.51/" +
							"centaurusweb/centaurusweb.dll/XMLgetViewData");
					connection.setRequestMethod(HttpConnection.POST);
					oStream = connection.openOutputStream();
					int xmlLength = xmlRequest.length();
					if (xmlLength > 0) {
						// dataSend tem o tamanho do xml a ser enviado...
						dataSend = new byte[xmlLength];
						// dataSend recebe o xmlRequest para ser enviado
						dataSend = xmlRequest.getBytes("UTF-8");
						oStream.write(dataSend);
						oStream.flush();

					}
					code = connection.getResponseCode();
					if (code != HttpConnection.HTTP_OK) {
						throw new IOException("HTTP response code: " + code);
					}

					iStream = connection.openInputStream();
					int receveLength = (int) connection.getLength();
					if (receveLength > 0) {
						dataReceve = new byte[receveLength];
						int totalBytes = 0;
						int bytesRead = 0;
						while ((totalBytes < receveLength) | (bytesRead > 0)) {
							bytesRead = iStream.read(
									dataReceve, totalBytes, receveLength - totalBytes);
							if (bytesRead > 0) {
								totalBytes += bytesRead;
							}
						}
					}
					// guarda a xml recebida em xmlGeneric, que será
					// retornada no final do metodo para a classe que a chamou
					xmlProcessed = new String(dataReceve);
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					try {
						//notify();
						//observer o que isso faz: nada...
						if (iStream != null) {
							iStream.close();
						}
						if (oStream != null) {
							oStream.close();
						}
						if (connection != null) {
							connection.close();
						}
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
}

class ParseXml {

	kXMLElement root, temp;

	public ParseXml() {
		root = new kXMLElement();
		temp = null;
	}

	public void createParse(String xml) {
		//String key;
		try {
			root.parseString(xml);
		} catch (kXMLParseException ke) {
			System.out.print(ke);
		}
	}

	public String findPropriety(String p) {
		String propriety = root.getProperty(p);
		return propriety;
	}
	// procura pelos nodos
	public kXMLElement findChild(kXMLElement s, Vector c) {
		if (c.size() == 0) {
			return s;
		}
		if (s != null) {
			for (int i = 0; i <= s.countChildren(); i++) {
				temp = (kXMLElement) s.getChildren().elementAt(i);
				if (temp.getTagName().equalsIgnoreCase(((String) c.firstElement()))) {
					c.removeElementAt(0);
					return findChild(temp, c);
				}
			}
		}
		return null;
	}
}

class Login extends Form implements Runnable, CommandListener {

	private Command cmExit;
	private Command cmLogin;
	private Command cmDone;
	CentaurusMidlet midlet;
	public String ctkey = "";
	TextField userfild = new TextField("Usuário", "", 64, TextField.ANY);
	TextField passwordfild = new TextField("Senha", "", 64, TextField.PASSWORD);
	CreateImage criarImagem = new CreateImage("");
	Gauge gaugeCL = new Gauge("Carregando ...", false, 10, 0);

	public Login(String title, CentaurusMidlet midlet) {
		super(title);

		this.midlet = midlet;
		cmExit = new Command("Exit", Command.EXIT, 0);
		cmLogin = new Command("Login", Command.OK, 0);

		setCommandListener(this);
		addCommand(cmLogin);
		addCommand(cmExit);
		append(userfild);
		append(passwordfild);

		start();// coloquei pra iniciar direto....
	}

	public void commandAction(Command c, Displayable s) {
		if (c == cmLogin) {
			start();
		}
		if (c == cmDone) {
			midlet.display.setCurrent(this);
		}
		if (c == cmExit) {
			midlet.Quit();
		}
	}

	public void start() {
		Thread t = new Thread(this);
		t.start();
	}

	public void run() {
		HttpConnection connection = null;
		InputStream iStream = null;
		//OutputStream oStream = null;
		//String newUrl = null;
 /*	 String user = userfild.getString();
		String password = passwordfild.getString();
		 */ String user = "r";
		String password = "relica";
		byte[] data = null;
		// Barra de Loading
		int appendRecord; // serve para deletar o gauge depois
		appendRecord = append(gaugeCL);
		 
		try {
			gaugeCL.setValue(1);
			connection = (HttpConnection) Connector.open("http://192.168.0.51/" +
					"centaurusweb/centaurusweb.dll/xmllogin?" +
					user + "&" + password);
			int code = connection.getResponseCode();
			switch (code) {
				case HttpConnection.HTTP_OK:
					gaugeCL.setValue(7);
					iStream = connection.openInputStream();
					//oStream = connection.openOutputStream();
					int length = (int) connection.getLength();
					if (length > 0) {
						data = new byte[length];
						int totalBytes = 0;
						int bytesRead = 0;
						while ((totalBytes < length) | (bytesRead > 0)) {
							bytesRead = iStream.read(
									data, totalBytes, length - totalBytes);
							if (bytesRead > 0) {
								totalBytes += bytesRead;
							}
						}
					}
					gaugeCL.setValue(10);
					String xmlLogin = new String(data);
					connection.close();//Fecha a conexão
					autenticaXml(xmlLogin); // verica se o login deu ok
					break;
				default:
					Alert a = new Alert("Centaurus Mobile",
							"Erro na conexao de login", null, AlertType.ERROR);
					a.setTimeout(Alert.FOREVER);
					cmDone = new Command("DONE", Command.OK, 0);
					midlet.display.setCurrent(a);
					break;
			}
		} catch (Exception e) {
			System.out.print(e);
		} // linha inutil, ja que tem o aviso.
		this.delete(appendRecord);
		/*
		try {
		String a = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
				   "<XMLLoginResponse success=\"TRUE\" " +
				   "ctkey=\"1354101C190009060B03095849535E4D57585B0454\""+
				   "RoleId=\"2\" RoleTitle=\"Administrador\"/>";
			  autenticaXml(a); // verica se o login deu ok
		}catch(Exception e) {}
		*/ 
	}

	public void autenticaXml(String xml) {
		String key;
		kXMLElement root = new kXMLElement();
		try {
			root.parseString(xml);
			key = root.getProperty("SUCCESS");
			if (key.equals("TRUE")) {
				ctkey = root.getProperty("CTKEY");
				midlet.showScreen("menu");
			} else {
				criarImagem.loadPath("/imagens/error.png");
				Alert a = new Alert("ERRO!",
						"   Login inválido", criarImagem.img, AlertType.ERROR);
				a.setTimeout(Alert.FOREVER);
				cmDone = new Command("OK", Command.OK, 0);
				midlet.display.setCurrent(a);
			}
		} catch (kXMLParseException ke) {
			System.out.print(ke);
		}
	}
}

class TextBoxTB extends TextBox implements CommandListener {

	private Command cmBack;	  // Command to go back
	private Command cmOk;	  // Command Done
	private CentaurusMidlet midlet; // The midlet

	public TextBoxTB(String title, String text, int maxSize, int constraints,
			CentaurusMidlet midlet) {
		// Call the TextBox constructor
		super(title, text, maxSize, constraints);

		// Save reference to MIDlet so we can access its methods
		this.midlet = midlet;

		// Create the Commands. Notice the priorities assigned
		cmBack = new Command("Back", Command.BACK, 1);
		cmOk = new Command("Ok", Command.OK, 1);
		this.addCommand(cmBack);
		this.addCommand(cmOk);
		this.setCommandListener(this);
	}

	public void commandAction(Command c, Displayable s) {
		if (c == cmBack) {
			// pede para mostrar o menu
			midlet.showScreen("menu");
		}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai parceiro beleza ?

 

La em cima no seu codigo

public void startConnection() {
		Thread t = new Thread(this);
		//t.start chama, em baixo nível, o "run".
		t.start();
		// interrompe a execução do código. Quando "run" acabar de executar
		// o código continua o seu fluxo. Isso indica que a thread acabou, pois
		// ela termina com no final de "run".
		try {
			t.join();
		} catch (InterruptedException ex) {
			Alert b = new Alert("erro no try",
				   "ex", null, AlertType.ERROR);
			b.setTimeout(10000);
		}
	}
   ........
Voce vai precisar utilizar os metodos wait(), notifiy() (sua thread vai invoca-lo depois se executar a logica do negocio) para resolver seu problema, estes metodos devem estar dentro de um bloco sicronizado.

Da uma pesquisada sobre interações entre Threads ou post as duvidas ai.

Flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.