2013-04-12 3 views
7

Я пытаюсь добавить обработчик по умолчанию к моему приложению, чтобы я мог восстановиться из других необработанных исключений.MonoDroid: Unhandled Exception Recovery

Я нашел три механизма, предоставляемых Android/MonoDroid, которые, насколько я могу судить, должны сделать это возможным, но я не могу заставить их работать. Вот мой код:

using System; 
using Android.App; 
using Android.Content; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.OS; 

namespace TestApp { 
    [Android.App.Activity(Label = "TestApp", MainLauncher = true, Icon = "@drawable/icon")] 
    public class MainActivity : Activity { 
     protected override void OnCreate(Bundle bundle) { 
      base.OnCreate(bundle); 
      SetContentView(new LinearLayout(this)); 

      //set up handlers for uncaught exceptions: 
      //Java solution 
      Java.Lang.Thread.DefaultUncaughtExceptionHandler = new ExceptionHandler(this); 
      //MonoDroid solution #1 
      AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironment_UnhandledExceptionRaiser; 
      //MonoDroid solution #2 
      AppDomain.CurrentDomain.UnhandledException += delegate { new Alert(this, "AppDomain.CurrentDomain.UnhandledException", "error"); }; 

      //throw an exception to test 
      throw new Exception("uncaught exception"); 
     } 

     void AndroidEnvironment_UnhandledExceptionRaiser(object sender, RaiseThrowableEventArgs e) 
     { 
      //found a suggestion to set the Handled flag=true, but it has no effect 
      new Android.Runtime.RaiseThrowableEventArgs(e.Exception).Handled = true; 
      new Alert(this, "AndroidEnvironment.UnhandledExceptionRaiser", "error"); 
     } 
    } 

    public class ExceptionHandler : Java.Lang.Object, Java.Lang.Thread.IUncaughtExceptionHandler { 
     private Context _context; 
     public ExceptionHandler(Context c) { _context = c; } 
     public void UncaughtException(Java.Lang.Thread thread, Java.Lang.Throwable ex) { 
      new Alert(_context, "java exception handler"); 
     } 
    } 

    public class Alert { 
     public Alert(Context c, string src, string title = "alert") { 
      Android.App.AlertDialog.Builder builder = new Android.App.AlertDialog.Builder(c); 
      builder.SetTitle(title); 
      builder.SetMessage(src); 
      builder.SetPositiveButton("Ok", delegate { }); 
      Android.App.AlertDialog alert = builder.Create(); 
      alert.Show(); 
     } 
    } 
} 

Любая помощь будет оценена, спасибо!

+0

Вы когда-нибудь получали эту работу? Я вижу похожие проблемы, когда не отлаживаю приложение. Я могу сказать вам, что «AndroidEnvironment» вызывается и обрабатывает неперехваченные исключения до того, как «AppDomain» делает. –

+0

Это не способ «установить флаг Handled = true», он должен быть «e.Handled = true;» ...: -B –

ответ

0

Вы можете перехватить большинство исключений из AppDomain.CurrentDomain.UnhandledException. Но вы не можете вызвать AlertDialog в этом делетете, потому что: 1. Приложение разбито. 2. Событие UnhandledException называется как минимум. 3. alert.Show() выполняется async (в потоке пользовательского интерфейса)

Итак, вы должны использовать операции синхронизации (например, System.IO). Вы не должны использовать собственные пользовательские интерфейсы, потому что они асинхронны.

Смежные вопросы