Могу ли я вызвать метод, прежде чем мое приложение выйдет из строя
Я новичок в Android, и я всегда вижу исключения, когда я запускаю свой код. Итак, кто-нибудь может сказать мне, можно ли вызвать метод до того, как приложение выйдет из строя в любом месте без "try-catch".
5 ответов
Это был бы лучший способ обработки неисследованного исключения:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
appInitialization();
}
private void appInitialization() {
defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
}
private UncaughtExceptionHandler defaultUEH;
// handler listener
private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
ex.printStackTrace();
// TODO handle exception here
}
};
}
Приложение - это базовый класс для тех, кому необходимо поддерживать глобальное состояние приложения. И, следовательно, здесь, это будет лучшим местом для обработки таких исключений.
РЕДАКТИРОВАТЬ: приведенный выше код будет обрабатывать необработанные исключения, если они создаются внутри потока пользовательского интерфейса. Если в рабочем потоке возникла исключительная ситуация, вы можете обработать ее следующим образом:
private boolean isUIThread(){
return Looper.getMainLooper().getThread() == Thread.currentThread();
}
// Setup handler for uncaught exceptions.
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
public void handleUncaughtException(Thread thread, Throwable e) {
e.printStackTrace(); // not all Android versions will print the stack trace automatically
if (isUIThread()) {
// exception occurred from UI thread
invokeSomeActivity();
} else { //handle non UI thread throw uncaught exception
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
invokeSomeActivity();
}
});
}
}
Я думаю, что вы ищете UncaughtExceptionHandler. Он уведомляется всякий раз, когда исключение запускается и не перехватывается, когда оно всплывает через ваше приложение.
См. http://www.intertech.com/Blog/android-handling-the-unexpected/ для получения дополнительной информации о реализации этого в Android.
Существует метод Uncaught exception, который вызывается непосредственно перед принудительным закрытием диалога, вы можете написать там часть кода. Пожалуйста, проверьте Использование глобальной обработки исключений на Android.
Попробуй так
1) создать класс
import android.content.Context;
import android.content.Intent;
import android.os.Process;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.Thread.UncaughtExceptionHandler;
public class CrashReportHandler implements UncaughtExceptionHandler {
public static void attach(Context context) {
Thread.setDefaultUncaughtExceptionHandler(
new CrashReportHandler(context)
);
}
///////////////////////////////////////////// implementation
private CrashReportHandler(Context context) {
m_context = context;
}
public void uncaughtException(Thread thread, Throwable exception) {
StringWriter stackTrace = new StringWriter();
exception.printStackTrace(new PrintWriter(stackTrace));
//You will get call back here when app crashes.
// from RuntimeInit.crash()
Process.killProcess(Process.myPid());
System.exit(10);
}
private Context m_context;
}
Как использовать этот класс?
напишите эту строку в вашей деятельности onCreate()
метод
CrashReportHandler.attach(this);
Используйте CrashLytics для аварийного репортера бесплатно и легко внедрить