2013-04-12 39 views
7

Tôi đang cố gắng thêm trình xử lý mặc định vào ứng dụng của mình để tôi có thể khôi phục từ các ngoại lệ không được giải quyết khác.MonoDroid: Khôi phục ngoại lệ không hợp lệ

Tôi đã tìm thấy ba cơ chế do Android/MonoDroid cung cấp, theo như tôi có thể nói, nên thực hiện điều này có thể, nhưng tôi không thể nhận được bất kỳ công việc nào trong số đó. Đây là mã của tôi:

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

Mọi trợ giúp sẽ được đánh giá cao, cảm ơn!

+0

Bạn đã bao giờ làm việc này chưa? Tôi thấy các sự cố tương tự khi không gỡ lỗi ứng dụng của mình. Tôi có thể nói với bạn rằng 'AndroidEnvironment' được gọi và xử lý các ngoại lệ chưa được thực hiện trước khi' AppDomain' thực hiện. –

+0

Đó không phải là cách "để thiết lập cờ Handled = true", nó phải là 'e.Handled = true;' ...: -B –

Trả lời

0

Bạn có thể bắt hầu hết các ngoại lệ trong sự kiện AppDomain.CurrentDomain.UnhandledException. Nhưng bạn không thể gọi AlertDialog trong đại biểu này, bởi vì: 1. Ứng dụng bị lỗi. 2. Sự kiện UnhandledException được gọi ít nhất. 3. alert.Show() được thực hiện không đồng bộ (trong chuỗi giao diện người dùng)

Vì vậy, bạn nên sử dụng các thao tác đồng bộ hóa (ví dụ: System.IO). Bạn không nên sử dụng các hoạt động UI gốc, vì chúng không đồng bộ.

Các vấn đề liên quan