[RESOLVIDO] Mostrar mensagem caso aconteça uma exceção não capturada

8 respostas
E

Olá pessoal!

Fiz uma classe para reportar as exceções não capturadas, conforme mostra nesse site: [url]http://stackoverflow.com/questions/601503/how-do-i-obtain-crash-data-from-my-android-application[/url].

Esta é minha classe:
package br.com.tdta.service.sender;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import br.com.tdta.service.view.MessageDialog;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

/**
 *
 * @author eliangela
 */
public class ErrorSender implements Thread.UncaughtExceptionHandler {

	private Activity activity;

	public ErrorSender(Activity activity) {
		this.activity = activity;
	}

	public void enviaErro(final String erro) {
		try {
			List<NameValuePair> valores = new ArrayList<NameValuePair>();
			valores.add(new BasicNameValuePair("erro", erro));

			HttpPost httppost = new HttpPost("http://192.168.1.1/android/recebeErros.php");
			httppost.setEntity(new UrlEncodedFormEntity(valores));
			HttpClient httpclient = new DefaultHttpClient();
			httpclient.execute(httppost);
		} catch (IOException ex) {
		}
	}

	public void uncaughtException(Thread thread, Throwable trw) {
		new Thread(new Runnable() {

			public void run() {
				MessageDialog.showOkDialog(activity, "Ocorreu um erro.\nClique para finalizar.", new OnClickListener() {

					public void onClick(DialogInterface arg0, int arg1) {
						activity.finish();
					}
				});
			}
		}).start();

		StringWriter sw = new StringWriter();
		PrintWriter pw = new PrintWriter(sw);
		trw.printStackTrace(pw);
		pw.close();
		enviaErro(sw.toString());
	}
}

Essa classe está reportando os erros na URL que eu quero. Mas o problema é que a tela está travando quando aparece a caixa de mensagem.
Se eu não coloco a caixa de mensagem, a tela fecha tranquilo (com o comando activity.finish();), mas se eu coloco a caixa de mensagem, a mensagem aparece, mas a tela trava. O que eu estou fazendo de errado??

Obrigada

8 Respostas

M

Tente dar um dismiss na Dialog antes.

E

Olá, Marky!

Não funcionou direito aqui :frowning: ! A janela fica tudo preta.
Se eu fechar normalmente pelo botao FECHAR (esse botão chama o metodo finish()), a minha activity fecha normalmente. Mas com o dialog.dismiss(), está ficando travado numa tela preta.

Alguma outra idéia?

A

olá,
Você está numa thread diferente da UI thread.
Defina um handler na activity e através dela você poderá acessar a tela.

E

Olá, A H Gusukuma!

Estou pesquisando sobre como definir um handler na activity, mas não encontrei nada que me ajudasse.
Você tem algum link ou exemplo?

Obrigada

E

Olá, pessoal!

Resolvi meu problema com essa API: ACRA

Só estou com um pouco de dificuldades pra enviar o StackTrace via POST aqui… mas no site diz que é possivel!

Obrigada a todos

A

Com atraso, mas tenta o seguinte:

Na activity inclui:

public Handler handler = new Handler();

Na classe postada, substitui:

private Runnable enviaMensagem = new Runnable() {
	public void run() {
                MessageDialog.showOkDialog(activity, "Ocorreu um erro.\nClique para finalizar.", new OnClickListener() {   
  
                    public void onClick(DialogInterface arg0, int arg1) {   
                        activity.finish();   
                    }   
                });   

	}
 }



 public void uncaughtException(Thread thread, Throwable trw) {   
        new Thread(new Runnable() {   
              public void run() {   
              	activity.handler.post(enviaMensagem);   
        		 
  	      }   
        }).start();   
.
.
.
E

Obrigada A H Gusukuma!
Vou tentar isso e depois posto o resultado.

Não estava querendo usar uma Library só pra isso… se eu usar o ACRA, minha aplicação vai ficar muito grande so por causa dos logs.

Vou tentar nesse fim de semana e daí falo.

Até mais

E

Olá, A H Gusukuma!
infelizmente não funcionou o que vc me sugeriu.

vou continuar usando o ACRA aqui.

Obrigada a todos pela ajuda.

Criado 6 de outubro de 2011
Ultima resposta 11 de out. de 2011
Respostas 8
Participantes 3