2017-07-23 1 views
0

J'ai une application PCL Xamarin Forms utilisant Prism. En outre, l'application est un client SignalR. Dans la MainPage (que l'échafaudage crée), je configure SignalR:Exception lors de la navigation vers une autre page dans Xamarin Forms à l'aide de Prism et SignalR

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

Cela fonctionne comme prévu. Le serveur SignalR obtient l'événement de groupe de jointure. Mon problème concerne les événements reçus, c'est-à-dire le gestionnaire "NavigateToSignaturePad". Ce gestionnaire se présente comme suit:

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

Comme je reçois écrit l'exception suivante lorsque le message est reçu signalR:

à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à Java.Interop.JniEnvironment + InstanceMethods.CallVoidMethod (exemple Java.Interop.JniObjectReference, méthode Java.Interop.JniMethodInfo ) [0x00068] en: 0 à Android.Runtime.JNIEnv.CallVoidMet hod (System.IntPtr jobject, System.IntPtr jmethod) [0x0000e] dans < 9ab9faae1b4b4f0da28e7c4ac61e2c78>: 0 à Android.Views.IMenuInvoker.Clear() [0x00033] dans < 9ab9faae1b4b4f0da28e7c4ac61e2c78>: 0 à Xamarin.Forms. Platform.Android.AppCompat.NavigationPageRenderer.UpdateMenu () [0x0005a] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ AppCompat \ NavigationPageRenderer.cs: 682 à Xamarin.Forms.Platform. Android.AppCompat.NavigationPageRenderer.ToolbarTrackerOnCollectionChanged (Expéditeur System.Object, EventArgs System.EventArgs) [0x00000] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xama rin.Forms.Platform.Android \ AppCompat \ NavigationPageRenderer.cs: 668 à Xamarin.Forms.Internals.ToolbarTracker.EmitCollectionChanged() [0x00008] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ Internes \ ToolbarTracker.cs: 60 à Xamarin.Forms.Internals.ToolbarTracker.OnPropertyChanged (expéditeur de System.Object, System.ComponentModel.PropertyChangedEventArgs propertyChangedEventArgs) [0x00052] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms. noyau \ Internes \ ToolbarTracker.cs: 130 au (wrapper-délégué invocation) : invoke_void_object_PropertyChangedEventArgs (objet, System.ComponentModel.PropertyChangedEventArgs) à Xamarin.Forms.BindableOb ject.OnPropertyChanged (System.String propertyName) [0x0000a] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 137 à Xamarin.Forms.Element.OnPropertyChanged (System.String propertyName) [0x00000] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ Element.cs: 379 à Xamarin.Forms.BindableObject.SetValueActual (propriété Xamarin.Forms.BindableProperty, Xamarin.Forms.BindableObject + BindablePropertyContext contexte, valeur System.Object, System.Boolean currentlyApplying, Xamarin.Forms.BindableObject + SetValueFlags attributs, System.Boolean silencieux) [0x000f4] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 581 à Xamarin.Forms.BindableObject.SetValueCore (propriété Xamarin.Forms.BindableProperty, valeur System.Object, Xamarin.Forms.BindableObject + attributs SetValueFlags, Xamarin.Forms.BindableObject + SetValuePrivateFlags privateAttributes) [0x0014b] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 378 à Xamarin.Forms.BindableObject.SetValue (propriété Xamarin.Forms.BindableProperty, la valeur System.Object, System.Boolean fromStyle, System.Boolean checkAccess) [0x0005f] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 531 à Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindablePropertyKey propertyKey, valeur System.Object) [0x0000e] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs: 9 1 à Xamarin.Forms.NavigationPage.set_CurrentPage (Xamarin.Forms.Page valeur ) [0x00000] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ NavigationPage.cs: 85 à Xamarin.Forms. NavigationPage.PushPage (page Xamarin.Forms.Page) [0x00011] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ NavigationPage.cs: 371 à Xamarin.Forms.NavigationPage + d__90.MoveNext() [0x0002f] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin.Forms.Core \ NavigationPage.cs: 350

--- Fin de trace de la pile à partir de l'emplacement précédent où --- exception a été levée à système .Runti me.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche System.Threading.Tasks.Task) [0x0003e] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche System.Threading.Tasks.Task) [0x00028] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading. Tâches.Tâche de tâche) [0x00008] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à Xamarin.Forms.NavigationPage + d__48.MoveNext() [0x0017f] dans C: \ BuildAgent3 \ work \ ca3766cfc22354a1 \ Xamarin .Forms.Core \ NavigationPage.cs: 182

--- Fin de trace de la pile à partir de l'emplacement précédent où --- exception a été levée à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Tâche System.Threading.Tasks.Task) [0x0003e] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche System.Threading.Tasks.Task) [0x00028] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (tâche System.Threading.Tasks.Task) [0x00008] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à Prism.Navigation.PageNavigationService + d__31.MoveNext() [0x00139] dans < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Fin de trace de la pile à partir de l'emplacement précédent où --- exception a été levée à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche de System.Threading.Tasks.Task) [0x0003e] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (système Tâche .Threading.Tasks.Task) [0x00028] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 a t System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (tâche de System.Threading.Tasks.Task) [0x00008] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à Prism.Navigation.PageNavigationService + <> c__DisplayClass17_0 + < b__0> d.MoveNext() [0x00091] dans < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Fin de trace de la pile à partir de l'emplacement précédent où exception a été levée --- à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] dans < 3fd174ff54b1462 28c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche de System.Threading.Tasks.Task) [0x0003e] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (système tâche .Threading.Tasks.Task) [0x00028] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (tâche System.Threading.Tasks.Task) [0x00008] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à Prism.Navigation.PageNavigationService + d__24.MoveNext() [0x00125] dans < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Fin de trace de la pile à partir de l'emplacement précédent où --- exception a été levée à système. Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche System.Threading.Tasks.Task) [0x0003e] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threa tâche ding.Tasks.Task) [0x00028] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (tâche System.Threading.Tasks.Task) [0x00008] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à Prism.Navigation.PageNavigationService + d__17.MoveNext() [0x00198] dans < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Fin de trace de pile de l'emplacement précédent où l'exception a été levée --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Jeter() [0x0000c] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche de System.Threading.Tasks.Task) [0x0003e] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche System.Threading.Tasks.Task) [0x00028] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (tâche de System.Threading.Tasks.Task) [ 0x00008] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.Comp ilerServices.TaskAwaiter.GetResult() [0x00000] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à Prism.Navigation.PageNavigationService + d__14.MoveNext() [0x0016b] dans < 7a32c28f35024e719a93e31b4d1e3d2a>: 0 --- Fin de trace de la pile précédente de endroit où exception a été levée --- à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks. Tâche tâche) [0x0003e] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.Ta skAwaiter.HandleNonSuccessAndDebuggerNotification (tâche de System.Threading.Tasks.Task) [0x00028] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (tâche System.Threading.Tasks.Task) [0x00008] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à System.Runtime.CompilerServices.TaskAwaiter.GetResult() [0x00000] dans < 3fd174ff54b146228c505f23cf75ce71>: 0 à ReceiptManager.SignatureCapture.ViewModels.MainPageViewModel + d__12.MoveNext() [0x0005a] dans C: \ Repos \ ContentManagment.ReceiptManager.SignatureCapture \ Source \ ReceiptManager.SignatureCapture \ ViewModels \ MainPageViewM odel.cs: 65 --- Fin de la trace de la pile Android.Util.AndroidRuntimeException gérée --- android.view.ViewRootImpl $ CalledFromWrongThreadException: Seul le thread d'origine qui a créé une hiérarchie de vues peut toucher ses vues. à android.view.ViewRootImpl.checkThread (ViewRootImpl.java:6556) à android.view.ViewRootImpl.requestLayout (ViewRootImpl.java:907) à android.view.View.requestLayout (View.java:18722) à android.view.View.requestLayout (View.java:18722) au android.view.View.requestLayout (View.java:18722) au android.view.View.requestLayout (View.java:18722) au android. view.requestLayout (View.java:18722) au android.view.View.requestLayout (View.java:18722) au android.widget.RelativeLayout.requestLayout (RelativeLayout.java:360) à android.view. View.requestLayout (View.java:18722) au android.view.View.requestLayout (View.java:18722) au android.view.View.requestLayout (View.java:18722) au android.view.View.requestLayout (View.java:18722) au android.support.v7.widget.ActionMenuPresenter.updateMenuView (ActionMenuPresenter.java:231) à android.support.v7.view.menu.MenuBuilder.dispatchPresenterUpdate (MenuBuilder.java:284) à android.support.v7.view.menu.MenuBuilder.onItemsChanged (MenuBuilder.java:1030) à android.support.v7.view.menu.MenuBuilder.clear (MenuBuilder.java: 589)

Pourquoi est-ce que la propriété Title (liée à une étiquette sur MainPage) se met à jour correctement, cependant, la navigation vers une autre page génère un problème de thread d'interface utilisateur?

J'ai également essayé d'utiliser la méthode Device.BeginInvokeOnMainThread (mise en commentaire pour référence) et l'application se bloque avec une exception non gérée.

Je suis sur la version 2.3.3.192 de Xamarin.Forms en utilisant Visual Studio 2017 déploiement sur simulateur Android. Merci.

Répondre

0

Je pense que le problème n'était pas tellement lié à l'invocation du gestionnaire par Signalr, mais plutôt à la vue/page vers laquelle je naviguais. J'ai eu une liaison à un TextCell dans ce modèle de vue et il semblait être la principale cause du problème. J'ai juste utilisé une étiquette à la place et le problème est parti. Pour référence ici est le code que je fini avec:

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

Je ne dois cependant utiliser le BeginInvokeOnMainThread. Sans cela, aucune exception n'a été levée mais la navigation n'a pas eu lieu non plus.