5

我是 android 的新手,我在运行代码时总是看到异常。所以,有人可以告诉我,我可以在应用程序在没有“try-catch”的情况下在任何地方崩溃之前调用一个方法吗?

4

5 回答 5

12

这将是处理未捕获异常的更好方法:

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();
                }
            });
        }
    }
于 2013-11-13T05:00:42.043 回答
0

我认为您搜索的是 UncaughtExceptionHandler。每当一个异常被触发并且没有在它通过你的应用程序冒泡的过程中被捕获时,它就会被通知。

有关在 android 中实现此功能的更多详细信息,请参阅http://www.intertech.com/Blog/android-handling-the-unexpected/

于 2013-11-13T04:42:20.983 回答
0

试试这个方法

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);
于 2013-11-13T04:49:00.197 回答
0


在强制关闭对话框之前调用了一个名为 Uncaught exception 的方法,您可以在那里编写您的代码。请检查Using Global Exception Handling on android

于 2013-11-13T04:52:53.637 回答
-1

使用 CrashLytics 免费且易于实施的崩溃报告器

https://www.crashlytics.com/

于 2013-11-13T05:05:58.390 回答