Principales respuestas
Problemas con NetworkStatusChanged

Pregunta
-
Hola,
Estoy intentando controlar que cuando mi App se queda sin internet, avise al usuario y no le deje hacer nada hasta que vuelva la conexión. Para ello estoy añadiendo un controlador al evento NetworkStatusChanged de NetworkInformation. He aislado el problema en un proyecto de ejemplo básico, así lo podréis reproducir. El código de MainPage.xaml.vb es este:
Imports Windows.Networking.Connectivity Public NotInheritable Class MainPage Inherits Page Private errorM As String Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) AddHandler NetworkInformation.NetworkStatusChanged, AddressOf NetworkInformation_NetworkStatusChanged End Sub Private Sub NetworkInformation_NetworkStatusChanged(sender As Object) 'Throw New NotImplementedException Try Dim estadoNet As Object estadoNet = NetworkInformation.GetInternetConnectionProfile() If estadoNet Is Nothing Then txtTexto.Text = "Sin conexión" Else txtTexto.Text = "Con conexión" End If Catch ex As Exception errorM = ex.Message End Try End Sub End Class
La aplicación casca al cambiar el el text de txtTexto, y el error que da, la verdad, es bastante poco intuitivo, al menos para mi claro.
Si a alguien le ha pasado esto mismo y sabe cómo resolverlo os lo agradecería.
Gracias
Javier Camacho
- Editado JavierCam martes, 14 de agosto de 2012 15:46
Respuestas
-
Hola Javier, te mando el código en VB, porque yo también lo uso y lo mismo es un poco complicada la "traducción" desde C#:
Imports Windows.Networking.Connectivity Imports Windows.UI.Core Public NotInheritable Class MainPage Inherits Page Private errorM As String 'Puntero al "despachador" de eventos del hilo de la interfaz de usuario Private myCoreDispatcher As CoreDispatcher = Window.Current.CoreWindow.Dispatcher Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) AddHandler NetworkInformation.NetworkStatusChanged, AddressOf NetworkInformation_NetworkStatusChanged End Sub Private Sub NetworkInformation_NetworkStatusChanged(sender As Object) 'Throw New NotImplementedException Try Dim estadoNet As ConnectionProfile = NetworkInformation.GetInternetConnectionProfile() If estadoNet Is Nothing Then Dim resp = myCoreDispatcher.RunAsync(CoreDispatcherPriority.Normal, Sub() txtTexto.Text = "Sin conexión" End Sub) Else Dim resp = myCoreDispatcher.RunAsync(CoreDispatcherPriority.Normal, Sub() txtTexto.Text = "Con conexión" End Sub) End If Catch ex As Exception errorM = ex.Message End Try End Sub End Class
Saludos,
Francisco
- Propuesto como respuesta Josue YerayMVP, Moderator sábado, 18 de agosto de 2012 9:08
- Marcado como respuesta Josue YerayMVP, Moderator viernes, 31 de agosto de 2012 9:43
Todas las respuestas
-
Hola Javier
es normal que falle, estás intentando modificar el UI del usuario desde un hilo secundario de la aplicación. Tienes que utilizar un Dispatcher para poder acceder a ese hilo de ejecución:
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, delegate { txtTexto.Text = "Sin conexión"; });
Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server
-
En los Tips & Tricks de MSDN España se muestra como hacer esto:
- Cómo detectar cambios en el estado de conexión a la red (XAML/C#)
- Cómo actualizar el interfaz de usuario desde un hilo de ejecución secundario (XAML/C#)
Puedes consultar todos los Tips & Trick aqui: http://blogs.msdn.com/b/esmsdn/archive/2012/08/08/tips-amp-tricks-de-desarrollo-para-windows-8.aspx
Un saludo
-
Hola Javier, te mando el código en VB, porque yo también lo uso y lo mismo es un poco complicada la "traducción" desde C#:
Imports Windows.Networking.Connectivity Imports Windows.UI.Core Public NotInheritable Class MainPage Inherits Page Private errorM As String 'Puntero al "despachador" de eventos del hilo de la interfaz de usuario Private myCoreDispatcher As CoreDispatcher = Window.Current.CoreWindow.Dispatcher Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) AddHandler NetworkInformation.NetworkStatusChanged, AddressOf NetworkInformation_NetworkStatusChanged End Sub Private Sub NetworkInformation_NetworkStatusChanged(sender As Object) 'Throw New NotImplementedException Try Dim estadoNet As ConnectionProfile = NetworkInformation.GetInternetConnectionProfile() If estadoNet Is Nothing Then Dim resp = myCoreDispatcher.RunAsync(CoreDispatcherPriority.Normal, Sub() txtTexto.Text = "Sin conexión" End Sub) Else Dim resp = myCoreDispatcher.RunAsync(CoreDispatcherPriority.Normal, Sub() txtTexto.Text = "Con conexión" End Sub) End If Catch ex As Exception errorM = ex.Message End Try End Sub End Class
Saludos,
Francisco
- Propuesto como respuesta Josue YerayMVP, Moderator sábado, 18 de agosto de 2012 9:08
- Marcado como respuesta Josue YerayMVP, Moderator viernes, 31 de agosto de 2012 9:43