cara dá uma olhada para ver se o metodo ProcessaRespostaServidor() está funcionando certo e se “str” está recebendo algum valor, porque aparentemente teu codigo está certo
algumas dicas para ficar mais facil de ler o codigo:
muda ProcessaRespostaServidor() para private, pois só quem usa ele é a classe conexao
a blz o metodo processarespostaservidor so esta public pq esqueci de trocar para private estava fazendo um teste.
Cara de certeza q a varialvel esta recebendo o valor correto, pois rodei o debug e esta correto. So que o galho é esse ta tudo certo mais nao funcionou , qdo crio o objeto para receber o valor ele cai fora do compilador. tem ideia do q posso ser. algum dica de como estaciar e criar objetos, pois o mais comum é os metodos get e set.
:shock: agora que eu fui ver. Tu está em uma thread. pode ser esse o problema, quando eu trabahava com threads no j2me tb dava mt erro. acabei colocando a classe toda como thread na hora de chamá-la
bom, coloquei como statica e agora funcionou blz, value pela dica, mais ficou 2 duvidas ainda. Porque tem que ser estatica e s funciona na segunda vez q clico, na primeira ele retorna a str= null.
cara, é o seguinte: sabe o que é uma variável estática? R: é uma variável da classe que permanece no objeto mesmo quando tu cria ele de novo… ela é estática, o nome já diz.
ai o que está acontecendo com o teu código:
na classe principal, tu chama a 1 linha em uma thread. Como thread é concorrente - executa ao mesmo tempo o código - não dá tempo de con.getDados() ter valor, pois o processador vai passar antes pela linha 2 do que pela linha que seta a variável srt, lá em conexão. Entendeu? o código não vai executar em seqüência e sim ao mesmo tempo, é isso que é uma thread.
Conexao con = new Conexao(this.tfAcct.getString(), this.tfPwd.getString());
siBalance.setText(con.getDados());
soluções:
Melhor Solução: na classe Conexao, tirar o extends Thread , isso vai fazer com que o código execute com um todo, e ele só vai pegar o getDados() quando o run() estiver concluído
Solução Gambiarra:
1° passo: coloca uma variavel global boolean “estaProcessando” na classe conexão e seta ela para false quando str ganhar algum valor.
2° passo: na classe principal, depois da linha 1 coloca um while a variavel boolean da classe conexão for true - ela fica parada esperando até ser verdade.
Conexao con = new Conexao(this.tfAcct.getString(), this.tfPwd.getString());
while (estaProcessando){}
siBalance.setText(con.getDados());
bem, espero ter ajudar em alguma coisa, q q coisa grita ai
e ai blz, bah cara agora sim ta funcionando perfeito e detalhe esta bem mais rapido do que antes, tentei fazer a gambiarra mais nao funcionou entao fiz o que voce sugeriu tirar o extends thread e ai deu certo. Valeu pela dica este projeto que usar no meu tcc. Outra coisa aprveitando sera que voce sabe de ealgum banco de dados que roda com j2me e no palm, pocket, etc, pq assim vou fazer conexao com o servidor onde vai estar o banco de dados mais acho q vai ficar muito lento, toda vez tera que acessar os dados via servlets. Bom qualquer coisa grita ai.
da uma olhada agora como ficou o codigo
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class Principal extends MIDlet implements CommandListener {
private Display display;
public Form frmPrincipal;
Alert alError;
private Command cmPOST;
private Command cmExit;
private TextField tfAcct;
private TextField tfPwd;
private StringItem siBalance;
public Principal(){
display = Display .getDisplay(this);
cmPOST = new Command("Obter dados", Command.SCREEN, 3);
cmExit = new Command("Sair", Command.EXIT, 1);
tfAcct = new TextField("Conta : ", "", 5, TextField.NUMERIC);
tfPwd = new TextField("Password: ", "", 10, TextField.ANY | TextField.PASSWORD);
siBalance = new StringItem("Saldo: ", "");
//siBalance = new StringItem("Saldo: ", "");
frmPrincipal = new Form("Informações da conta");
frmPrincipal.addCommand(cmPOST);
frmPrincipal.addCommand(cmExit);
frmPrincipal.append(tfAcct);
frmPrincipal.append(tfPwd);
frmPrincipal.append(siBalance);
frmPrincipal.setCommandListener(this);
}
protected void startApp() throws MIDletStateChangeException {
display.setCurrent(frmPrincipal);
//throw new UnsupportedOperationException("Not supported yet.");
}
protected void pauseApp() {
//throw new UnsupportedOperationException("Not supported yet.");
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
destroyApp(arg0);
//throw new UnsupportedOperationException("Not supported yet.");
}
public void commandAction(Command c, Displayable d) {
if (c == cmPOST){
try {
Conexao con = new Conexao(this.tfAcct.getString(), this.tfPwd.getString());
con.buscaDados();
if (con.getRet())
siBalance.setText(con.getDados());
} catch (Exception ex) {
ex.printStackTrace();
} finally {
}
}else if(c == cmExit){
notifyDestroyed();
}
//throw new UnsupportedOperationException("Not supported yet.");
}
}
import javax.microedition.io.*;
import java.io.*;
public class Conexao{
HttpConnection httpCon;
OutputStream Ostrm;
InputStream Istrm;
//private StringItem siBalance;
private String conta;
private String senha;
private static String str;
boolean ret = false;
private boolean ok = false;
public Conexao(String conta, String senha){
this.conta = conta;
this.senha = senha;
}
public void buscaDados(){
try{
String url = "http://localhost:8080/Servlets/GetNpostServlet"
+ "?" +
"account="+this.conta+"&password="+this.senha;
httpCon = (HttpConnection) Connector.open(url);
Ostrm = httpCon.openOutputStream();
httpCon.setRequestMethod(HttpConnection.POST);
httpCon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
byte data[] = ("account="+this.conta).getBytes();
Ostrm.write(data);
data = ("&password="+this.senha).getBytes();
Ostrm.write(data);
Ostrm.flush();
Istrm = httpCon.openInputStream();
setRet(ProcessaRespostaServidor(httpCon, Istrm));
} catch (IOException ex) {
ex.printStackTrace();
}finally{
if (Ostrm != null)
try {
Ostrm.close();
} catch (IOException ex) {
ex.printStackTrace();
}
if (Istrm != null)
try {
Istrm.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public boolean ProcessaRespostaServidor(HttpConnection http, InputStream Istrm)
throws IOException{
String errorMsg = null;
if (http.getResponseCode() == HttpConnection.HTTP_OK) {
int length = (int) http.getLength();
if (length !=-1){
byte servletData[] = new byte[length];
Istrm.read(servletData);
str =new String(servletData);
getDados();
}else {
ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
int ch;
while ((ch = Istrm.read()) != -1)
bStrm.write(ch);
str = new String(bStrm.toByteArray());
getDados();
bStrm.close();
}
ok = true;
return true;
}else
errorMsg = new String(http.getResponseMessage());
ok = false;
return false;
}
public void setRet(boolean ret){
this.ret=ret;
}
public boolean getRet(){
return(this.ret);
}
public String getDados() {
return(Conexao.str);
}
public void setDados(String str){
Conexao.str=str;
}
}
Respondendo ao seu pedido quanto ao banco de dados: Sim, a plataforma j2me tem um banco de dados…
mas é meio podre… não podre, digamos limitado, pois tu vai trabalhar bem baixo nivel com ele.
o banco de dados do j2me chama-se RecordStore… tu salva os teus dados em array de bytes.
sentiu o pepino né dhasudhusahduas? tu vai terque entao criar meio que uma estrutura de dados para poder salvar esses objetos a não ser que tu ache um metodo como transformar objeto em array de bytes… eu estou procurando, mais nao achei nada ainda.
Então resolvi fazer um método que codifica uma hashtable, recebendo uma string identificadora - a coluna - e uma matriz de strings - que sao as linhas- O método converte isso para array de bytes. Tipo… a hasthable guarda 2 objects, um para ter o nome do objeto , geralmente, e outro para, na maioria das vezes guardar algum tipo de data.
é ótimo para salvar. e rápido … ele só não está mais rápido porque está usando string em algumas parte do código, ai eu teria que trocar para stringbuffer - isso reduz o tempo de processamento pela metade nesse meu método, fiz os testes e computei o tempo… ele leva 2,5 segundo, em média, para processar 125.000.000 caracteres, está de bom tamanho… - mas fiz os teste no java nornal e quando fui passar para o mobile não tinha um método muito prático que é o metodo que tira partes nullas do array … mas isso já é outra coisa…
bem mas eu recomendo para ti dar uma olhada primeiro como funciona um RecordStore: http://dtondo.googlepages.com/Mod05-Licao05-Apostila.pdf
segundo, como transformar object para array de bytes… fazendo isso tu pode criar o teu método de armazenamento.
ah e quanto ao código, acho que tu pode dar umas melhoradas, especialmente na parte da conexão e no tratamento de exceções.
blz, essa forma eu ja conhecia mais sabe o cara esta acostumado a programar para desktop com insert, update e delete, entao nao achei que assim seria tao funcional. Acho que ficaria melhor banco de dados mesmo tipo oracle lite, ou compact sql server ou ainda o proprio banco da sybase para pockec pc, mais eu queria um banco multiplataforma assim como o j2me é. Mais to pesquisando ai pra ver se acho algum que se encaixe. Quanto ao tratamento de erros eu ainda nao fiz nenhum, sei que o codigo esta ruim , mais eu queria mesmo era fazer ele funcionar.vlw