Xamrin.Forms android端全局异常处理
以下为MainActivity中代码
using System; using Android.App; using Android.Content.PM; using Android.Runtime; using Android.OS; using XamrinScanner.Services; using Android.Content; using System.Threading.Tasks; using System.IO; using Environment = System.Environment; using System.Diagnostics; namespace XamrinScanner.Droid { [Activity(Label = "XamrinScanner", Icon = "@mipmap/shoujisaoma", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { public static Context AppContext; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); //unhander excption event AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException; TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException; global::Xamarin.Forms.Forms.SetFlags("FastRenderers_Experimental"); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); AiForms.Dialogs.Dialogs.Init(this); //need to write here AppContext = ApplicationContext; Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); App.TodoManager = new TodoManager(new SoapService()); //App.TodoManager = new TodoManager(); LoadApplication(new App()); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); } //global exception handling //link https://peterno.wordpress.com/2015/04/15/unhandled-exception-handling-in-ios-and-android-with-xamarin/ #region Error handling private static void TaskSchedulerOnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs) { var newExc = new Exception("TaskSchedulerOnUnobservedTaskException", unobservedTaskExceptionEventArgs.Exception); LogUnhandledException(newExc); } private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs) { var newExc = new Exception("CurrentDomainOnUnhandledException", unhandledExceptionEventArgs.ExceptionObject as Exception); LogUnhandledException(newExc); } internal static void LogUnhandledException(Exception exception) { try { const string errorFileName = "Fatal.log"; var libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // iOS: Environment.SpecialFolder.Resources var errorFilePath = Path.Combine(libraryPath, errorFileName); var errorMessage = String.Format("Time: {0}\r\nError: Unhandled Exception\r\n{1}", DateTime.Now, exception.ToString()); File.WriteAllText(errorFilePath, errorMessage); // Log to Android Device Logging. Android.Util.Log.Error("Crash Report", errorMessage); } catch { // just suppress any error logging exceptions } } /// <summary> // If there is an unhandled exception, the exception information is diplayed // on screen the next time the app is started (only in debug configuration) /// </summary> [Conditional("DEBUG")] private void DisplayCrashReport() { const string errorFilename = "Fatal.log"; var libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); var errorFilePath = Path.Combine(libraryPath, errorFilename); if (!File.Exists(errorFilePath)) { return; } var errorText = File.ReadAllText(errorFilePath); new AlertDialog.Builder(this) .SetPositiveButton("Clear", (sender, args) => { File.Delete(errorFilePath); }) .SetNegativeButton("Close", (sender, args) => { // User pressed Close. }) .SetMessage(errorText) .SetTitle("Crash Report") .Show(); } #endregion } }
*****有道无术,术尚可求;有术无道,止于术。*****