GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Thread problema / Aplicação .... parou inesperadamente. [RESOLVIDO]

Olá pessoal. Não sou muito CATEDRÁTICO em Java, por isso estou há muitas horas apanhando bastante aqui, acredito que o meu problema seja bobeirinha pra vocês que já são craques no assunto. Tenho 2 problemas no código abaixo;

1- Preciso executar o processo em background, tentei de TODAS as formas que eu vi no Google mas nenhuma funcionou, Thread, AsyncTask, Runnable… Nenhuma deu certo. Compila normal sem erro, mas a tela trava do mesmo jeito como se não tivesse sendo executado dentro de uma thread.

2- Quando eu executo o processo tendo conexão(Internet) normal rapidinha, tudo funciona às mil maravilhas, mas como o aplicativo vai rodar em um celular, é claro que a Internet VAI cair, o primeiro teste de cara que eu fiz foi tirar o cabo de rede da wan do wifi que o celular tá pegando, ou desativar no celular mesmo, eu pensei que com os tratamentos de exceção que eu coloquei, resolveria, NADA, eu recebo a seguinte mensagem quando o código executa sem Internet;

E encerra a aplicação.

O código que eu tô usando é o seguinte pessoal;

LoginActivity.java

[code]package com.sistemadynatrack.clientemobile;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class LoginActivity extends Activity {

Button   btnLogin;
EditText edtUsuario, edtSenha;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_login);
	
	edtUsuario = (EditText)findViewById(R.id.edtUsuario);
	edtSenha   = (EditText)findViewById(R.id.edtSenha);		
	
	btnLogin = (Button) findViewById(R.id.btnLogin);		
	btnLogin.setOnClickListener(new OnClickListener() {
		public void onClick(View v) {
			efetuarLogin();
		}
	});		
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	getMenuInflater().inflate(R.menu.login, menu);
	return true;
}		

protected void efetuarLogin() {
    new Thread(new Runnable() {
        public void run() {
    		String retornoServidor = Geral.getHtml(Geral.URLServidor+"&acao=login&usuario="+edtUsuario.getText().toString()+"&senha="+edtSenha.getText().toString()).trim();
    		if (retornoServidor != null) {
    			if (retornoServidor.equals("-1")) {
    				Geral.exibeMensagem("LOGIN INVALIDO", getBaseContext());
    			} else {
    				Geral.exibeMensagem("LOGIN EFETUADO COM SUCESSO", getBaseContext());
    			}
    		} else {
    			Geral.exibeMensagem("Erro durante a tentativa de conexão com o servidor!", getBaseContext());
    		}	    		
        }
    }).start();
}	

}[/code]

Geral.java

[code]package com.sistemadynatrack.clientemobile;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.Context;
import android.widget.Toast;

public class Geral {
public static String URLServidor = “https://seguro.sistemadynatrack.com:3750/cliente/mobileServidor/?chave=447689546987673”;

public static void exibeMensagem(String Msg, Context Ctx) {
	Toast msg = Toast.makeText(Ctx, Msg, Toast.LENGTH_LONG);
	msg.show();		
}

public static String getHtml(String url) {
	String Rst;
	
	try {
		HttpClient httpclient = new DefaultHttpClient();
		HttpGet httpget = new HttpGet(url);
		HttpResponse response = httpclient.execute(httpget);
		HttpEntity entity = response.getEntity();
		InputStream is = entity.getContent();
		BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);			
		Rst = reader.readLine();						
		is.close();
	} catch (ClientProtocolException e) {
		Rst = null;			
	} catch (IOException e) {
        Rst = null;
    } catch (Exception e) {
        Rst = null;
    }		
	
	if (Rst != null) {
		Rst = Rst.trim();
	}		
	
	return Rst;
}

}
[/code]

Ressaltando que o código executa muito bem quando tem conexão, já sem conexão eu recebo aquela mensagem como eu descrevi lá em cima e a aplicação encerra.

Valeu pessoal, desde já peço desculpas pela ignorância e por pedir ajuda com um problema tão bobo, também agradeço a atenção e qualquer ajuda é sempre bem vinda. Abraços à todos.

Pessoal eu consegui resolver da seguinte maneira, mas confesso que não ficou legal esse código não. Alguém ajuda a melhorar?

[code]package com.sistemadynatrack.clientemobile;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends Activity {

Button   btnLogin;
EditText edtUsuario, edtSenha;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_login);
	
	edtUsuario = (EditText)findViewById(R.id.edtUsuario);
	edtSenha   = (EditText)findViewById(R.id.edtSenha);		
	
	btnLogin = (Button) findViewById(R.id.btnLogin);		
	btnLogin.setOnClickListener(new OnClickListener() {
		public void onClick(View v) {
			efetuarLogin();
		}
	});		
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	getMenuInflater().inflate(R.menu.login, menu);
	return true;
}		


/* INÍCIO ROTINA ACESSO SERVIDOR E LOGIN */
final Handler MsgHandler = new Handler();	
String Msg;
final Runnable MsgRunnableRst = new Runnable() {
    public void run() {
        Toast.makeText(getBaseContext(), Msg, Toast.LENGTH_LONG).show();
    }
};

final Handler SrvHandler = new Handler();	
final Runnable SrvRunnableRst = new Runnable() {
    public void run() {
        //CÓDIGO CONEXÃO COM O SERVIDOR AQUI;
		String Rst;
		
		try {
			HttpParams httpParameters = new BasicHttpParams();
			int timeoutConnection = 20000;
			HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
			int timeoutSocket = 25000;
			HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);				
			HttpClient httpclient = new DefaultHttpClient(httpParameters);
			HttpGet httpget = new HttpGet(Geral.URLServidor+"&acao=login&usuario="+edtUsuario.getText().toString()+"&senha="+edtSenha.getText().toString());
			HttpResponse response = httpclient.execute(httpget);
			HttpEntity entity = response.getEntity();
			InputStream is = entity.getContent();
			BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);			
			Rst = reader.readLine().trim();						
			is.close();
		} catch (ClientProtocolException e) {
			Rst = null;			
		} catch (IOException e) {
            Rst = null;
        } catch (Exception e) {
            Rst = null;
        }		
		
		if (Rst != null) {
			Rst = Rst.trim();
		}
		
		if (Rst != null) {
			if (Rst.equals("-1")) {
	        	Msg = "LOGIN INVÁLIDO";
	        	MsgHandler.post(MsgRunnableRst);
			} else {
	        	Msg = "LOGIN EFETUADO COM SUCESSO";
	        	MsgHandler.post(MsgRunnableRst);
			}
		} else {
        	Msg = "Erro durante a tentativa de conexão com o servidor!";
        	MsgHandler.post(MsgRunnableRst);
		}    		
    }
};	

protected void efetuarLogin() {
    new Thread(new Runnable() {
        public void run() {	        	
        	SrvHandler.post(SrvRunnableRst);
        }
    }).start();
}	
/* FIM ROTINA ACESSO SERVIDOR E LOGIN */

}[/code]

Abraços.

Você pode verificar se existe conexão:

  1. Coloque a permissão no Manifest:
  1. Use o código para checar se tem conexão:

ConnectivityManager conexao = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = conexao.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { // Ok. Tem conexão } else { // Sem conexão }

É isso mesmo, sempre que você está executando algo em uma Thread e quer modificar algo em sua tela, tem que usar um Handler .

Valeu pelo retorno rapaziada. Gusukuma, infelizmente isso aí não resolveria não pois estar conectado no dispositivo não garante que vai haver conectividade com o servidor por #N razões, a ideia é jogar a mensagem de erro de conexão independentemente de usar o status de rede do dispositivo. Valeio Bezerra, eu postei esse código aí mas fui precipitado, depois quando fui implementar outras coisas no código eu tive muito problema, e esse código não executa de forma assíncrona travando a aplicação do mesmo jeito, ou seja, eu coloco um progress pra mostrar que tá processando, executo a rotina, e tiro o progress, só que com esse código aí o progress nem aparece porque trava. Eu resolvi da seguinte maneira(ficou PERFEITO), e o código(ao meu ver) ficou muito mais limpo, sugestões pra melhorar?

[code]package com.sistemadynatrack.clientemobile;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class LoginActivity extends Activity {

Button   btnLogin;
EditText edtUsuario, edtSenha;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_login);
	
	edtUsuario = (EditText)findViewById(R.id.edtUsuario);
	edtSenha   = (EditText)findViewById(R.id.edtSenha);		
	
	btnLogin = (Button) findViewById(R.id.btnLogin);		
	btnLogin.setOnClickListener(new OnClickListener() {
		public void onClick(View v) {
			efetuarLogin();
		}
	});		
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	getMenuInflater().inflate(R.menu.login, menu);
	return true;
}		


/* INICIO ROTINA LOGIN SERVIDOR */
AsyncLogin _AsyncLogin;
protected void efetuarLogin() {
	_AsyncLogin = new AsyncLogin();
	_AsyncLogin.execute();
}	

private class AsyncLogin extends AsyncTask<Void, Void, String> {
	ProgressDialog LoadingDialog;
	
    protected void onPreExecute() {
        LoadingDialog = ProgressDialog.show(LoginActivity.this, "Processando", "Por favor aguarde...", false, false);
    }
    
    protected String doInBackground(Void... arg0) {
		try {
		    Thread.sleep(2000);
		} catch (InterruptedException e) {}
    	
        return Geral.getRetornoServidor(Geral.URLServidor+"&acao=login&usuario="+edtUsuario.getText().toString()+"&senha="+edtSenha.getText().toString());
     }
    
    protected void onPostExecute(String Rst) {
		LoadingDialog.dismiss();					
		if (Rst != null) {
			if (Rst.equals("-1")) {
				Geral.exibeMensagem("Dados Inválidos", "Login Inválido! Por favor tente novamente.", LoginActivity.this);
			} else {
				Geral.exibeMensagem("Ok", "LOGIN EFETUADO TESTE.", LoginActivity.this);
			}
		} else {
			Geral.exibeMensagem("Erro", "Erro durante a tentativa de conexão!", LoginActivity.this);
		}        	
    }
}	
/* TERMINO ROTINA LOGIN SERVIDOR */	

}[/code]

Fechado o tópico pessoal, fica aí esse último post pra quem passar pelo mesmo sufoco que eu. Abraços.

//