我是Android的新手,当我运行代码时经常会遇到异常。请问有没有办法在应用程序崩溃之前调用一个方法而不需要使用“try-catch”语句?
我是Android的新手,当我运行代码时经常会遇到异常。请问有没有办法在应用程序崩溃之前调用一个方法而不需要使用“try-catch”语句?
这将是更好的处理未捕获异常的方式:
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
}
};
}
Application是一个基类,适用于需要维护全局应用程序状态的人。因此,在这里,处理这些异常将是更好的选择。
编辑: 如果未捕获的异常发生在UI线程中,则上述代码将处理它们。 如果异常发生在工作线程中,则可以按以下方式处理:
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();
}
});
}
}
尝试这种方式
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);
我认为你要找的是UncaughtExceptionHandler。它会在异常未被捕获并通过应用程序向上冒泡时通知您。
请参见http://www.intertech.com/Blog/android-handling-the-unexpected/,了解在Android中实现此功能的更多细节。
有一种叫做未捕获异常的方法,它会在强制关闭对话框之前被调用,你可以在那里编写你的代码。请查看在Android上使用全局异常处理。