敬酒不显示在UnCaughtExceptionHandler

我正在使用此代码来处理任何可能导致我的应用程序崩溃的未捕获的exception。

public class ExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler { private final Context myContext; public ExceptionHandler(Context context) { myContext = context; } public void uncaughtException(Thread thread, Throwable exception) { Toast.makeText(myContext, "The application has crashed, and a report is sent to the admin", Toast.LENGTH_SHORT).show(); StringWriter stackTrace = new StringWriter(); exception.printStackTrace(new PrintWriter(stackTrace)); System.err.println(stackTrace);// You can use LogCat too Intent intent = new Intent(myContext, CrashActivity.class); myContext.startActivity(intent); Process.killProcess(Process.myPid()); System.exit(10); } } 

当我运行一个已知的,但未捕获的exception(只是为了testing),活动“CrashActivity”被称为,但吐司之前必须出现,而不是显示。

其实我只想显示吐司,然后调用myContext.finish(); 而不是去CrashActivity。 但是,这在敬酒不可见。

我在哪里错了?

Solutions Collecting From Web of "敬酒不显示在UnCaughtExceptionHandler"

你可能是从一个线程调用Toast,而应该从UI线程调用Toast。

如果这没有帮助,请提供我们的logcat输出,所以我们可以看到你得到什么样的错误。

发现这个问题,同时谷歌search确切的相同的问题。 据我所知,只要存在应用程序上下文,就Toast.show()从UI线程调用Toast.show()

AFAIK:这里出现的问题如下:你试图显示一个Toast,然后你的应用程序被VMclosures,这意味着你的Toast也被closures了。

解决这个问题的方法如下:

  • 从sepearate线程运行Toast
  • 在未捕获exception处理程序中延迟closures应用程序。

我做的是以下几点:

Application::onCreate()

 Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { new Thread() { @Override public void run() { Looper.prepare(); Toast.makeText(getApplicationContext(), "Application crashed", Toast.LENGTH_LONG).show(); Looper.loop(); } }.start(); try { Thread.sleep(4000); // Let the Toast display before app will get shutdown } catch (InterruptedException e) { // Ignored. } } }); 

类似于ACRA中Toast通知的工作方式(实际上这是我从中得到的提示)。

从Android UncaughtExceptionHandler调用System.exit(0)可帮助应用程序从错误中恢复,并重新启动上次的Activity。 恕我直言,用户体验得到显着改善。 但是,这种方法需要在多个Android平台上进行尝试和testing。 已经在GB和JB上试过了。 它工作正常。 另外,我听说别人(我是Android的新手),调用System.exit()不build议在Android中,但..可以使用这个作为一个很好的恢复选项的Android应用程序崩溃。

  public void uncaughtException(Thread thread, Throwable ex) { new Thread() { @Override public void run() { Looper.prepare(); Toast.makeText(YourActivity.this, "Application has Crashed. Recovering now.", Toast.LENGTH_LONG).show(); /* Log relevant message/analytics from here. */ System.exit(1); Looper.loop(); } }.start(); }