2013-04-12 20 views
7

Uygulamam için bir varsayılan işleyici eklemeye çalışıyorum, bu nedenle işlenmeyen özel durumlardan kurtarılamıyorum.MonoDroid: İşlenmemiş İstisna Kurtarma

Android/MonoDroid tarafından sağlanan, söyleyebildiğim kadarıyla, bunu mümkün kılan, ancak bunların hiçbirini işe alamayacak olan üç mekanizma buldum. İşte kodum:

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(); 
     } 
    } 
} 

Herhangi bir yardım için teşekkür ederiz, teşekkürler!

+0

Hiç bu işe yaramadı mı? Başvurumda hata ayıklama yapıldığında benzer sorunlar görüyorum. “AndroidEnvironment” ın, “AppDomain” nin yapmasından önce yakalanmamış istisnaları çağırdığını ve işlediğini söyleyebilirim. –

+0

"Handled flag = true" ayarının yolu bu değil, "e.Handled = true;' ...: -B olmalıdır. –

cevap

0

AppDomain.CurrentDomain.UnhandledException olayındaki özel durumların çoğunu yakalayabilirsiniz. Ancak bu delege içinde AlertDialog'u arayamazsınız, çünkü: 1. Uygulama çöktü. 2. UnhandledException olayı en az denir. 3. alert.Show() eşzamansız olarak (UI iş parçacığı içinde) yürütüldü

Senkronizasyon işlemlerini kullanmalısınız (örneğin, System.IO). Yerel UI işlemlerini kullanmamalısınız, çünkü bunlar uyumsuzdur.