2017-07-23 1 views
0

Ich habe eine Xamarin Forms PCL-Anwendung mit Prism. Außerdem ist die Anwendung ein SignalR-Client. In der MainPage (die das Gerüst erstellt) ich Setup SignalR:Ausnahme beim Navigieren zu einer anderen Seite in Xamarin Forms mit Prism und SignalR

Dies funktioniert alles wie vorgesehen. Der SignalR-Server ruft das Join-Gruppenereignis ab. Mein Problem betrifft die empfangenen Ereignisse, d. H. Den Handler "NavigateToSignaturePad". Das Handler sieht wie folgt aus:

private async void NavigateToSignaturePad(string receiptText) 
    { 
     System.Diagnostics.Debug.WriteLine("Got a ShowSignatureControl event!"); 

     Title = "Got a ShowSignatureControl event!"; 

     try 
     { 
      //Device.BeginInvokeOnMainThread(async() => await navigationService.NavigateAsync("SignatureCapturePage")); 
      await navigationService.NavigateAsync("SignatureCapturePage"); 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex.Message); 
     } 
    } 

Wie schon geschrieben ich die folgende Ausnahme erhalten, wenn die signalR Nachricht empfangen wird:

bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei Java.Interop.JniEnvironment + InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference Beispiel Java.Interop.JniMethodInfo Methode) [0x00068] in: 0 bei Android.Runtime.JNIEnv.CallVoidMet hod (System.IntPtr jobject, System.IntPtr jmethod) [0x0000e] in < 9ab9faae1b4b4f0da28e7c4ac61e2c78>: 0 bei Android.Views.IMenuInvoker.Clear() [0x00033] in < 9ab9faae1b4b4f0da28e7c4ac61e2c78>: 0 bei Xamarin.Forms. Platform.Android.AppCompat.NavigationPageRenderer.UpdateMenu () [0x0005a] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ AppCompat \ NavigationPageRenderer.cs: 682 bei Xamarin.Forms.Platform. Android.AppCompat.NavigationPageRenderer.ToolbarTrackerOnCollectionChanged (System.Object-Absender, System.EventArgs-EreignisArgs) [0x00000] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xama rin.Forms.Platform.Android \ AppCompat \ NavigationPageRenderer.cs: 668 bei Xamarin.Forms.Internals.ToolbarTracker.EmitCollectionChanged() [0x00008] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ Interna \ ToolbarTracker.cs: 60 bei Xamarin.Forms.Internals.ToolbarTracker.OnPropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs PropertyChangedEventArgs) [0x00052] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms. Core \ Interna \ ToolbarTracker.cs: 130 at (wrapper delegierten invoke) : invoke_void_object_PropertyChangedEventArgs (Objekt, System.ComponentModel.PropertyChangedEventArgs) bei Xamarin.Forms.BindableOb ject.OnPropertyChanged (System.String propertyname) [0x0000a] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 137 bei Xamarin.Forms.Element.OnPropertyChanged (System.String property) [0x00000] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ Element.cs: 379 bei Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty Eigenschaft, Xamarin.Forms.BindableObject + BindablePropertyContext Zusammenhang System.Object Wert, System.Boolean currentlyApplying, Xamarin.Forms.BindableObject + SetValueFlags Attribute System.Boolean silent) [0x000f4] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 581 bei Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty Eigenschaft, System.Object Wert, Xamarin.Forms.BindableObject + SetValueFlags Attribute Xamarin.Forms.BindableObject + SetValuePrivateFlags privateAttributes) [0x0014b] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 378 bei Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty-Eigenschaft, System.Object-Wert, System.Boolean vonStyle, System.Boolean checkAccess) [0x0005f] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 531 bei Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindablePropertyKey propertyKey, System.Object value) [0x0000e] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 9 1 bei Xamarin.Forms.NavigationPage.set_CurrentPage (Xamarin.Forms.Page Wert) [0x00000] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ NavigationPage.cs: 85 bei Xamarin.Forms. NavigationPage.PushPage (Xamarin.Forms.Page-Seite) [0x00011] in C: \ BuildAgent3 \ Arbeit \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ NavigationPage.cs: 371 bei Xamarin.Forms.NavigationPage + d__90.MoveNext() [0x0002f] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ NavigationPage.cs: 350

--- Ende des Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei -System .Runti me.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task Aufgabe) [0x0003e] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task Aufgabe) [0x00028] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading. Tasks.Task-Task) [0x00008] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei Xamarin.Forms.NavigationPage + d__48.MoveNext() [0x0017f] in C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin .Forms.Core \ NavigationPage.cs: 182

--- Ende der Stapelüberwachung von früheren Stelle, an der Ausnahme geworfen wurde --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in < 3fd174ff54b146228c505f23cf75ce71>: 0 um System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task System.Threading.Tasks.Task) [0x0003e] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task Aufgabe) [0x00028] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task Aufgabe) [0x00008] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei Prism.Navigation.PageNavigationService + d__31.Movenext() [0x00139] in < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Ende der Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task Aufgabe) [0x0003e] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System .Threading.Tasks.Task-Task) [0x00028] in < 3fd174ff54b146228c505f23cf75ce71>: 0 a t System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task Aufgabe) [0x00008] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei Prism.Navigation.PageNavigationService + <> c__DisplayClass17_0 + < b__0> d.MoveNext() [0x00091] in < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Ende des Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- unter System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in < 3fd174ff54b1462 28c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task Aufgabe) [0x0003e] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System .Threading.Tasks.Task Aufgabe) [0x00028] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task Aufgabe) [0x00008] in < 3fd174ff54b146228c505f23cf75ce71>: 0 unter System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei Prism.Navigation.PageNavigationService + d__24.MoveNext () [0x00125] in < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Ende des Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei -System. Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task Aufgabe) [0x0003e] in < 3fd174ff54b146228c505f23cf75ce71>: 0 unter System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threa ding.Tasks.Task Aufgabe) [0x00028] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task Aufgabe) [0x00008] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei Prism.Navigation.PageNavigationService + d__17.MoveNext () [0x00198] in < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde --- unter System.Runtime.ExceptionServices.ExceptionDispatchInfo.Werfen() [0x0000c] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task Aufgabe) [0x0003e] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task Aufgabe) [0x00028] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task Aufgabe) [ 0x00008] in < 3fd174ff54b146228c505f23cf75ce71>: 0 unter System.Runtime.Comp ilerServices.TaskAwaiter.GetResult() [0x00000] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei Prism.Navigation.PageNavigationService + d__14.MoveNext () [0x0016b] in < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Ende der Stapelüberwachung von früheren Ort, wo Ausnahme ausgelöst wurde --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks. Aufgabenaufgabe) [0x0003e] in < 3fd174ff54b146228c505f23cf75ce71>: 0 unter System.Runtime.CompilerServices.Ta skAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task Aufgabe) [0x00028] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task Aufgabe) [0x00008] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] in < 3fd174ff54b146228c505f23cf75ce71>: 0 bei ReceiptManager.SignatureCapture.ViewModels.MainPageViewModel + d__12.MoveNext () [0x0005a] in C: \ Repos \ ContentManagment.ReceiptManager.SignatureCapture \ Quell \ ReceiptManager.SignatureCapture \ ViewModels \ MainPageViewM odel.cs: 65 --- Ende der verwalteten Android.Util.AndroidRuntimeException stack trace --- android.view.ViewRootImpl $ CalledFromWrongThreadException: Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren. bei android.view.ViewRootImpl.checkThread (ViewRootImpl.java:6556) bei android.view.ViewRootImpl.requestLayout (ViewRootImpl.java:907) bei android.view.View.requestLayout (View.java:18722) bei android.view.View.requestLayout (View.java:18722) um android.view.View.requestLayout (View.java:18722) um android.view.View.requestLayout (View.java:18722) um android. view.View.requestLayout (View.java:18722) um android.view.View.requestLayout (View.java:18722) um android.widget.RelativeLayout.requestLayout (RelativeLayout.java:360) bei android.view. View.requestLayout (View.java:18722) um android.view.View.requestLayout (View.java:18722) um android.view.View.requestLayout (View.java:18722) um android.view.View.requestLayout (View.java:18722) um android.support.v7.widget.ActionMenuPresenter.updateMenuView (ActionMenuPresenter.java:231) bei android.support.v7.view.menu.MenuBuilder.dispatchPresenterUpdate (MenuBuilder.java:284) bei android.support.v7.view.menu.MenuBuilder.onItemsChanged (MenuBuilder.java:1030) bei android.support.v7.view.menu.MenuBuilder.clear (MenüBuilder.java: 589)

Warum ist es, dass die Eigenschaft Titel (auf ein Etikett auf der Mainpage gebunden) gerade fein aktualisiert, die Navigation zu einer anderen Seite jedoch ein UI-Thread Problem wirft?

Ich habe versucht, die Device.BeginInvokeOnMainThread -Methode auch (als Referenz für die Auskommentierung), und die Anwendung stürzt mit einer unbehandelten Ausnahme ab.

Ich bin auf Version 2.3.3.192 von Xamarin.Forms Visual Studio 2017 verwenden, um Android-Simulator bereitstellen. Vielen Dank.

Antwort

0

denke ich, das Problem mit Signalr des Aufruf des Handlers nicht so viel war vielmehr die Ansicht/Seite I wurde die Navigation. Ich hatte eine Bindung zu einem TextCell in diesem Ansichtsmodell und es schien die Hauptursache für das Problem zu sein. Ich habe nur ein Etikett verwendet und das Problem ist weg. Als Referenz hier ist der Code, den ich am Ende mit:

public MainPageViewModel(INavigationService navigationService) 
    { 
     this.navigationService = navigationService; 

     SetupSignalr(); 
    } 

    private async void SetupSignalr() 
    { 
     hubConnection = new HubConnection("http://mypc:15816/"); 
     hubProxy = hubConnection.CreateHubProxy("SignatureCaptureHub"); 
     hubProxy.On<string>("ShowSignatureControl", receiptText => NavigateToSignaturePad(receiptText)); 
     await hubConnection.Start(); 

     await hubProxy.Invoke("JoinGroup", "Group1234"); 
    } 

    private void NavigateToSignaturePad(string receiptText) 
    { 
     System.Diagnostics.Debug.WriteLine("Got a ShowSignatureControl event!"); 

     var navigationParameters = new NavigationParameters 
     { 
      { "receiptText", receiptText } 
     }; 
     Device.BeginInvokeOnMainThread(() => navigationService.NavigateAsync(nameof(SignatureCapturePage), navigationParameters)); 
    } 

ich aber hatte zu dem BeginInvokeOnMainThread verwenden. Ohne es wurde keine Ausnahme ausgelöst, aber die Navigation ist auch nicht passiert.

Verwandte Themen