Сбой приложения при использовании обработчика необработанных исключений приводит к остановке приложения
Я использую необработанный обработчик исключений для перехвата исключений, но это приводит к остановке моего приложения. Я ссылаюсь на этот пост. Как мне остановить зомбирование моего приложения после обработки необработанного исключения? а также этот идеальный способ установить глобальный обработчик необработанных исключений в Android
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.advsearch);
setTitle("Advance Search");
Thread.setDefaultUncaughtExceptionHandler(new SRSDexception(this));
String trace = null;
String line;
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(SRSDAdvSearch.this
.openFileInput("stack.trace")));
while((line = reader.readLine()) != null) {
trace += line+"\n";
}
} catch(FileNotFoundException fnfe) {
// ...
} catch(IOException ioe) {
// ...
}
Intent sendIntent = new Intent(Intent.ACTION_SEND);
String subject = "Error report";
String body =
"Mail this to readerscope@altcanvas.com: "+
"\n\n"+
trace+
"\n\n";
sendIntent.putExtra(Intent.EXTRA_EMAIL,
new String[] {"readerscope@altcanvas.com"});
sendIntent.putExtra(Intent.EXTRA_TEXT, body);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.setType("message/rfc822");
SRSDAdvSearch.this.startActivity(
Intent.createChooser(sendIntent, "Title:"));
SRSDAdvSearch.this.deleteFile("stack.trace");
Это мой класс активности, который, в свою очередь, вызывает мой класс исключений. После прочтения URL вы узнаете, что я хочу.. Я скопировал для необработанного исключения, которое
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
public class SRSDexception implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
public SRSDexception(Activity app) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
this.app = app;
}
public void uncaughtException(Thread t, Throwable e)
{
// System.out.println("You crashed thread " + t.getName());
// System.out.println("Exception was: " + e.toString());
StackTraceElement[] arr = e.getStackTrace();
String Raghav =t.toString();
String report = e.toString()+"\n\n";
report += "--------- Stack trace ---------\n\n"+Raghav;
for (int i=0; i<arr.length; i++)
{
report += " "+arr[i].toString()+"\n";
}
report += "-------------------------------\n\n";
// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
report += "--------- Cause ---------\n\n";
Throwable cause = e.getCause();
if(cause != null) {
report += cause.toString() + "\n\n";
arr = cause.getStackTrace();
for (int i=0; i<arr.length; i++)
{
report += " "+arr[i].toString()+"\n";
}
}
report += "-------------------------------\n\n";
try {
FileOutputStream trace = app.openFileOutput(
"stack.trace", Context.MODE_PRIVATE);
trace.write(report.getBytes());
trace.close();
} catch(IOException ioe) {
// ...
}
defaultUEH.uncaughtException(t, e);
}
Трассировки стека
[android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314),
SRTekBox.Android.SRSD.SRSDAdvSearch.fnExpand(SRSDAdvSearch.java:390),
SRTekBox.Android.SRSD.SRSDAdvSearch$5.onClick(SRSDAdvSearch.java:209),
android.view.View.performClick(View.java:2408), android.view.View$PerformClick.run (View.java:8816),
android.os.Handler.handleCallback(Handler.java:587),
android.os.Handler.dispatchMessage(Handler.java:92),
android.os.Looper.loop(Looper.java:123),
android.app.ActivityThread.main(ActivityThread.java:4633),
java.lang.reflect.Method.invokeNative(Native Method),
java.lang.reflect.Method.invoke(Method.java:521),
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858),
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616),
dalvik.system.NativeStart.main(Native Method)]
Я не знаю, в чем проблема, это может быть
- моя нить выходит из строя
- мой обработчик не вызывается
- или это не исключение на первый план, но это приводит к остановке моего приложения
- Исключение делает его сбой следующих возможностей
Кто-нибудь может мне помочь, чтобы предотвратить эту остановку
1 ответ
Используйте ACRA (http://code.google.com/p/acra/)! Они делают то, что вам нужно, и решили проблемы, с которыми вы сталкиваетесь