none
Problemas con NetworkStatusChanged RRS feed

  • 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
    martes, 14 de agosto de 2012 15:45

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

    viernes, 17 de agosto de 2012 1:22

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

    miércoles, 15 de agosto de 2012 9:31
  • 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

    viernes, 17 de agosto de 2012 1:22