Android:在运行时异常退出之前显示吐司

Posted

技术标签:

【中文标题】Android:在运行时异常退出之前显示吐司【英文标题】:Android: Display toast before runtime exception exit 【发布时间】:2016-12-16 21:13:43 【问题描述】:

我有一个带有全局异常处理程序的应用程序,如下所示:

public class MyApplication extends Application 
    @Override
    public void onCreate() 
        super.onCreate();
        Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

    

我想避免在用户附近显示强制,并向用户显示友好的祝酒词,例如“出了点问题...”。 这是异常处理程序类:

public class ExceptionHandler implements
        Thread.UncaughtExceptionHandler 
    private final Context myContext;
    private final String LINE_SEPARATOR = "\n";


    public ExceptionHandler(Context context) 
        myContext = context;
    

    public void uncaughtException(Thread thread, Throwable exception) 
        StringWriter stackTrace = new StringWriter();
        exception.printStackTrace(new PrintWriter(stackTrace));
        StringBuilder errorReport = new StringBuilder();
        errorReport.append("************ CAUSE OF ERROR ************\n\n");
        errorReport.append(stackTrace.toString());
        Log.e("ERROR_TAG", errorReport.toString());
        Utils.showShortToast(R.string.something_went_wrong, myContext);
        new Handler().postDelayed(new Runnable() 
            @Override
            public void run() 
                   android.os.Process.killProcess(android.os.Process.myPid());
                   System.exit(10);
            
        ,1000);
    

问题是在显示 toast 时,应用程序冻结并等待 system.exit() 被调用,然后应用程序退出。正如它在下面的参考问题中注意到的那样,在显示 toast 后立即调用 exit() 会导致进程终止并且不显示 toast。

附:我读过this、this 和this,但都没有找到解决方案。

【问题讨论】:

为什么您会因问题而退出应用程序。处理异常应该处理它而不是杀死应用程序,创建一些 ErrorActivty 并在那里捕获。您正在做与标准 android 异常相同的操作 - 杀死应用程序,我不理解这种想法的目的。 @MaciejSikora 即使尝试处理所有异常,也可能会因为不同的原因(开发人员错误、开发人员缺乏知识、不同操作系统和平台的广泛变化)而没有捕获其中一些异常。所以我只想避免向用户显示著名的“强制关闭..”窗口并保存错误日志以查明问题并在将来处理未捕获的异常。这就是原因! :) 应用程序错误不是口袋妖怪,解决它们而不是捕获它们:)。改变思维方式。 @MaciejSikora 此方法是许多应用程序中常见的崩溃报告的一部分。显示 toast 只是为了通知用户。 【参考方案1】:

在 onDestroy() 中制作吐司。我认为这是个好方法:)

最好的问候

【讨论】:

以上是关于Android:在运行时异常退出之前显示吐司的主要内容,如果未能解决你的问题,请参考以下文章

为啥 android logcat 不显示运行时异常的堆栈跟踪?

Android 在程序运行时,有若干个activity,怎么在退出这个Activity是,释放掉它所占用的运行空间

搜索结果不匹配时,android中没有数据吐司

如何在android小部件中单击图像按钮显示吐司

Gradle 任务 assembleDebug 失败,退出代码为 1(运行时异常)

无法在 Android 设备上运行 Flutter 项目:ProcessException: gradlew异常退出