Warning: To avoid potential deadlock

4 respostas
bydumoraes

Pessoal preciso de uma ajuda qui com THREAD, ja pesquisei no forum mas só acha que tem que usar THREAD, mas nao tem nada de exemplo e confesso que achei meio confuso o que encontrei.

Seguinte, quando executa a linha 52, que faz a conexao com a rede para enviar, trava o emulador e da esse erro:

Warning: To avoid potential deadlock, operations that may block, such as
networking, should be performed in a different thread than the
commandAction() handler.

Ai que vem a ajuda, procurando no forum todos dizem: Implementa com uma nova thread, mas nao encontrei exemplos disso, onde e como seria essa thread neste codigo? Se alguem puder me ajudar agradeceria muito, pois sou novato em java, mas preciso fazer essa aplicacaozinha rodar.

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.*;

public class Connec extends MIDlet implements CommandListener{
    
    private Display display;
    private Form tela;
    private TextField tflat;
    private TextField tflon;
    private Command cmdEnviar;
    private Command cmdReceber;
    
    
    public void startApp(){
        
        display = Display.getDisplay( this );
        montarTelaInicial();
        display.setCurrent( tela );
    }
    
    public void pauseApp(){
        // metodo para pausar aplicacao
    }
    
    public void destroyApp( boolean b ){
        display.setCurrent( null );
        this.notifyDestroyed();
    }
    
    private void montarTelaInicial(){
        
        tela = new Form( "HTTP Sender" );
        tflat = new TextField( "Lat :", null, 10, TextField.DECIMAL );
        tflon = new TextField( "Lon :", null, 10, TextField.DECIMAL );
        
        cmdEnviar = new Command( "Enviar", Command.ITEM, 0);
        cmdReceber = new Command( "Receber", Command.ITEM,0);
        
        tela.append( tflat );
        tela.append( tflon );
        
        tela.addCommand( cmdEnviar );
        tela.addCommand( cmdReceber );
        tela.setCommandListener( this );
        
    }
    
    public void commandAction( Command c, Displayable d ){
        
        if ( c == cmdEnviar ){
            passarInformacaoServidor();
            
        }else if ( c == cmdReceber ){
              System.out.println("Não funcional!");
        }  
    
    }
              
    
    private void passarInformacaoServidor(){
           
        try {
                        
            HttpConnection con = (HttpConnection)Connector.open("http://www.site.com.br/gps/requestpos.asp?lat=12345&lon=9999"); 
            
            int status = -1;
            
            String situacao = "";
                     
            situacao = ( status != HttpConnection.HTTP_OK?"Erro : Conexao":"OK" );
            
            montarTelaInicial();
            tela.append( situacao );
            display.setCurrent( tela );
            
        }catch (IOException e) {
             System.out.println("IOException " + e.toString());
        }
        }
}

4 Respostas

S

Cara já tive o mesmo problema, tu tens que fazer a parte que conecta no http rodar em um thread separada.

bydumoraes

Silveta, o que voce disse, ja achei em todas as respostas do forum, o que eu nao consigo colocar é essa implementacao, sempre da erro, e notei que em todas as respostas ninguem posta um exemplo, apenas diz ja resolvi o problema. Venho de anos de programacao windows, e nos foruns quando temos duvidas sempre pegamos o codigo do cara que tem o problema, e postamos pelo menos parte ou indicamos um exemplo de como fazer, o que tenho notado que no forum de Java nao acontece muito… rsrs

Sei que ninguem é obrigado a fazer isso, mas ajudaria muita gente, inclusive os posts em aberto.

Tu poderias me ajudar nessa implementacao?

grato

S
final Thread th = new Thread() {

			@Override
			public void run() {
				try {

					HttpConnection con = (HttpConnection) Connector
							.open("http://www.site.com.br/gps/requestpos.asp?lat=12345&lon=9999");

					int status = -1;

					String situacao = "";

					situacao = (status != HttpConnection.HTTP_OK ? "Erro : Conexao" : "OK");

					montarTelaInicial();
					tela.append(situacao);
					display.setCurrent(tela);

				} catch (IOException e) {
					System.out.println("IOException " + e.toString());
				}
			}
		};

dai para rodar basta “th.start();”

e quanto ao sua comparação de foruns entre java e outras linguagens, creio que o programador java deve ser ensinando a pescar não receber o peixe.

[]'s

bydumoraes

Silveta valeu pela ajuda, eu ja havia conseguido, mas acho que me expressei mal no comentario quanto a comparacao, nesses mais de 10 anos de desenvolvimento, jamais fiz um curso sequer, sempre “pesquei meu peixe”, conforme tu disse, concordo que tem muita gente que quer tudo mastigado, eu comecei a desenvolver ( se posso dizer assim ) faz 2 semanas, por necessidade mesmo, vi coisas em Java, que em bibliotecas Ruindows ( como costumo dizer ), seria dificil e demorado de desenvolver. Confesso que to me surpreendendo com a linguagem e pretendo adotá-la daqui para frente. O que falta é realmente entender algumas coisas, que com o decorrer da pescaria ira superar os meus conhecimentos em plataformas ruindows.

PS.: Estou complementando o codigo e posto o codigo aqui.

grato

Criado 8 de agosto de 2008
Ultima resposta 8 de ago. de 2008
Respostas 4
Participantes 2