2016-09-26 4 views
0

定期的に私のXamarin.Forms Androidアプリがこのエラーでクラッシュしますが、AndroidHud (AndHud)コンポーネントがメッセージを期待通りにレンダリングする時間は99%です。私のMainActivityからUIスレッドから呼び出されます(その時点で他のアクティビティはアクティブではありません)。AndroidモノラルRTTスタックトレースは何を意味しますか? (AndHud 1.3.1)

[mono-rt] Stacktrace: 
[mono-rt] 
[mono-rt] at <unknown> <0xffffffff> 
[mono-rt] at (wrapper managed-to-native) Java.Interop.NativeMethods.java_interop_jnienv_call_void_method_a (intptr,intptr&,intptr,intptr,Java.Interop.JniArgumentValue*) <0x00053> 
[mono-rt] at Java.Interop.JniEnvironment/InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference,Java.Interop.JniMethodInfo,Java.Interop.JniArgumentValue*) [0x0006c] in /Users/builder/data/lanes/3511/0e59c362/source/Java.Interop/src/Java.Interop/Java.Interop/JniEnvironment.g.cs:11639 
[mono-rt] at Java.Interop.JniPeerMembers/JniInstanceMethods.InvokeVirtualVoidMethod (string,Java.Interop.IJavaPeerable,Java.Interop.JniArgumentValue*) [0x00031] in /Users/builder/data/lanes/3511/0e59c362/source/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:26 
[mono-rt] at Android.App.Dialog.SetContentView (Android.Views.View) [0x0002c] in /Users/builder/data/lanes/3511/0e59c362/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Android.App.Dialog.cs:2160 
[mono-rt] at AndroidHUD.AndHUD/<SetupDialog>c__AnonStorey3.<>m__0 (object) <IL 0x000be, 0x00483> 
[mono-rt] at Android.App.SyncContext.Send (System.Threading.SendOrPostCallback,object) [0x00025] in /Users/builder/data/lanes/3511/0e59c362/source/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:26 
[mono-rt] at AndroidHUD.AndHUD.SetupDialog (Android.Content.Context,AndroidHUD.MaskType,System.Action,System.Func`4<Android.Content.Context, Android.App.Dialog, AndroidHUD.MaskType, Android.Views.View>) <IL 0x0003d, 0x0023f> 
[mono-rt] at AndroidHUD.AndHUD.showStatus (Android.Content.Context,bool,string,AndroidHUD.MaskType,System.Nullable`1<System.TimeSpan>,System.Action,bool,System.Action) <IL 0x000cd, 0x0064f> 
[mono-rt] at AndroidHUD.AndHUD.Show (Android.Content.Context,string,int,AndroidHUD.MaskType,System.Nullable`1<System.TimeSpan>,System.Action,bool,System.Action) <IL 0x0002c, 0x0021f> 
[mono-rt] at Apollo1.Droid.MainActivity.showProgress (Apollo1.Domain.ProgressEvent) [0x00059] in /Volumes/Devology/Source Code/Agile Orange Ltd/Apollo1.Mobile/Apollo1.Android/MainActivity.cs:254 
[mono-rt] at Apollo1.Droid.MainActivity/<handleProgressEvent>c__AnonStorey0.<>m__0() [0x000c2] in /Volumes/Devology/Source Code/Agile Orange Ltd/Apollo1.Mobile/Apollo1.Android/MainActivity.cs:241 
[mono-rt] at Java.Lang.Thread/RunnableImplementor.Run() [0x0000b] in /Users/builder/data/lanes/3511/0e59c362/source/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:36 
[mono-rt] at Java.Lang.IRunnableInvoker.n_Run (intptr,intptr) [0x00009] in /Users/builder/data/lanes/3511/0e59c362/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Java.Lang.IRunnable.cs:81 
[mono-rt] at (wrapper dynamic-method) object.3f472f08-eb57-4472-a265-297a4af40e0a (intptr,intptr) <IL 0x00011, 0x0003b> 
[mono-rt] at (wrapper native-to-managed) object.3f472f08-eb57-4472-a265-297a4af40e0a (intptr,intptr) <IL 0x00021, 0x000ef> 

/示した方法は、ダイアログは非常た隠すこれは...私は通常、ダイアログを開始する方法を

this.Publish<ProgressEvent>(new ProgressEvent("Lets show this message!")); 

であり、これはそのイベントをリッスン何

void handleProgressEvent (ProgressEvent progressEvent) 
{ 
    Device.BeginInvokeOnMainThread (() => { 
     // Ensure only one thing can enter at a time 
     lock (this) { // <-- Added recently to try to solve the problem 
      if (progressEvent.Hide) { 
       hideProgress(); 
      } else { 
       if (currentProgressMessage != null && !progressEvent.Message.Equals (currentProgressMessage)) { 
        // Don't bother hiding if it's the same message about to be shown 
        if (!currentProgressMessage.Equals (progressEvent.Message)) { 
         hideProgress(); 
        } 
       } 
       // Don't bother showing if it's the same message 
       if (!progressEvent.Message.Equals (currentProgressMessage)) { 
        showProgress (progressEvent); 
       } 

       currentProgressMessage = progressEvent.Message; 
      } 
     } 
    }); 
} 

です単にコンポーネント自体に委譲していますが、ロギングと例外処理を追加しています(違いはありませんが、アプリはまだクラッシュしています)。

void showProgress (ProgressEvent progressEvent) 
{ 
    try { 
     logger.Log (this, LogLevelEnum.INFO, "AndroidHUD invoking show with Forms.Context" + Forms.Context + " progressEvent.Message:" + progressEvent.Message); 
     AndroidHUD.AndHUD.Shared.Show (Forms.Context, progressEvent.Message, -1, AndroidHUD.MaskType.Black); 
     showing++; 
     logger.Log (this, LogLevelEnum.INFO, "AndroidHUD show completed showing:"+showing); 
    } catch (Exception e) { 
     logger.Log (this, LogLevelEnum.ERROR, "AndroidHUD show error caught with reason e:" + e.Message); 
     logger.Log (this, e); 
    } 
} 

void hideProgress() 
{ 
    try { 
     logger.Log (this, LogLevelEnum.INFO, "AndroidHUD invoking hideProgress with Forms.Context" + Forms.Context); 
     AndroidHUD.AndHUD.Shared.Dismiss (Forms.Context); 
     showing--; 
     currentProgressMessage = null; 
     logger.Log (this, LogLevelEnum.INFO, "AndroidHUD hideProgress completed showing:" + showing); 
    } catch (Exception e) { 
     logger.Log (this, LogLevelEnum.ERROR, "AndroidHUD hideProgress error caught with reason e:" + e.Message); 
     logger.Log (this, e); 
    } 
} 
+0

通常、かなりハードなクラッシュです。何らかの理由でAndHUD Showメソッドがアプリをクラッシュさせます。 Dialogs cross platformを表示したい場合は、Acr.UserDialogsの使用をお勧めします。メッセージを渡すよりもはるかにクリーンなコードにつながります。 – Cheesebaron

答えて

0

誰にとっても、私はそれが最後にAndHudのせいであったとは思わない。

UIスレッドではなく、現在のスレッドコンテキストでいくつかのイベントが発生しています。受信側のリスナーはUI操作を実行していました。

私はこの変更を行ったので、このエラーは数日では見られませんでした。

UIスレッドを続行しないと、状況がまったく違うことがあります。

関連する問題