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

4 respostas
L

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;

A aplicação Dynatrack (processo com.sistemadynatrack.clientemobile) parou inesperadamente. Tente novamente.

E encerra a aplicação.

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

LoginActivity.java
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();
	}	
}
Geral.java
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;
	}
}

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.

4 Respostas

L

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

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 */

	
}

Abraços.

A

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 }

V

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

L

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?

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 */	
	
    
}

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

Criado 11 de novembro de 2013
Ultima resposta 11 de nov. de 2013
Respostas 4
Participantes 3