Pessoal, to com um problema com thread…
Minha intensao é fazer uma tela de login. Ao digitar Enviar, deve-se autenticar o usuario. Se forneceu os dados corretamente, prossegue, senao fica onde está.
O que eu fiz:
Tenho uma classe (Login) com os campos pra digitar e um botao enviar. Ao clicar em enviar, instancio uma classe (Autenticacao) que faz conexao com banco de dados.
Na classe Autenticacao eu implemento Runnable para fazer conexao HTTP.
Gostaria que a thread ficasse travada, esperando fazer a conexao. Aí sim voltar pra Login e ver se usuario pode continuar ou nao.
Do jeito que tá, fica travado na tela “Is it OK to use airtime?”.
O que eu estou fazendo de errado? Devo mudar a aborgadem do problema?
Alguém tem alguma sugestao?
[code]public class Login implements CommandListener {
.
.
.
public void commandAction(Command command, Displayable disp) {
if (command == exit) {
principal.fecharAplicacao();
} else if (command == send) {
if (verificaDados()) {
Autenticacao autenticacao = new Autenticacao(this, login.getString(), senha.getString());
synchronized (autenticacao) {
retornou = false;
new Thread(autenticacao).start();
while (!retornou) {
try {
autenticacao.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
if (autenticacao.infoValida()) {
System.out.println("passou");
} else {
System.out.println("nao passou");
}
}
}
}
}[/code]
Os metodos da classe Autenticacao invocaServlet() e recebeDados() funcionam. Já testei separadamente.
O problema é na chamada e resposta da thread.
[code]import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import main.Login;
/**
-
@author Particular
*/
public class Autenticacao implements Runnable {private String login, senha, infoRecebidas;
HttpConnection http = null;
InputStream inputStream = null;
public Thread thread;
public boolean terminou = false;
Login telaLogin;//getter and setters
public Autenticacao(Login telaLogin, String login, String senha) {
this.login = login; this.senha = senha; this.telaLogin = telaLogin; thread = new Thread(this); thread.start();}
public void run() {
synchronized (this) {try { invocaServlet(); infoRecebidas = recebeDados(); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } telaLogin.retornou = true; notify(); }}
public boolean infoValida(){
if (infoRecebidas == null){
return false;
}
else{
return true;
}
}public void invocaServlet(){
String url = “http://localhost:8080/teste”;try { // Cria e abre uma conexao HTTP http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.GET); } catch (Exception e) { e.printStackTrace(); }}
public String recebeDados() {
String str = null;
try {
inputStream = http.openInputStream();if (http.getResponseCode() == HttpConnection.HTTP_OK) { int length = (int) http.getLength(); if (length != -1) { byte servletData[] = new byte[length]; inputStream.read(servletData); str = new String(servletData); } // Tamanho nao disponivel else { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int ch; while ((ch = inputStream.read()) != -1) { baos.write(ch); } str = new String(baos.toByteArray()); baos.close(); } } else { // Se mensagem diferente de HTTP_OK entao mostra o erro } } catch (Exception e) { e.printStackTrace(); } finally { fechaConexao(http, inputStream); return str; }}
public void fechaConexao(HttpConnection http, InputStream inputStream) {
try {
if (inputStream != null) {
inputStream.close();
}
if (http != null) {
http.close();
}
} catch (Exception e) {
}
}
}[/code]
Obrigado desde já.