Introdução

No desenvolvimento de aplicações para dispositivos móveis é muito comum realizar operações que necessitem de uma conexão ativa com a internet. Por exemplo, pode-se precisar conectar a um web service para obter e enviar dados, ou transferir arquivos de/para um servidor FTP.

Geralmente esse tipo de operação demora um pouco, dependendo da quantidade de dados a trafegar e de velocidade da conexão. Às vezes ocorre ainda de o aparelho não estar conectado à internet e o processo ter de ser interrompido. Quando essa situação é prevista pelo desenvolvedor, alguns problemas podem ser evitados, caso contrário, informações podem ser perdidas e/ou modificadas indevidamente devido ao processo de transferência de dados através da internet ter sido interrompido por falta de conexão.

Este rápido comentário já nos permite perceber a importância de a aplicação ter conhecimento de quando há ou não conexão com a internet no momento da realização de certas operações. Para deixar um pouco mais claro, tomemos um exemplo hipotético onde temos o seguinte cenário:

Uma aplicação de vendas mantém os dados armazenados no banco de dados local e fornece uma funcionalidade de “Enviar Dados”, onde o usuário transfere os dados locais para um web service (por exemplo, para ser lido pela empresa em uma aplicação desktop). Esse procedimento de envio de dados pode ser descrito a partir da seguinte sequência de passos.

  1. Ler os dados do banco local e criar um arquivo XML para envio;
  2. Apagar os dados locais para poupar espaço de armazenamento, uma vez que as informações estarão seguras no servidor que as receberá.
  3. Enviar o arquivo para um web service.

É fácil perceber que se não houver conexão com a internet no momento do envio, os dados já terão sido excluídos da base local. Na melhor das hipóteses, será necessário ler os arquivos criados e armazenar novamente os dados. Se a falta de conexão fosse verificada antes de o processo ser iniciado, a perda dos dados da base local (ou no mínimo o “retrabalho” de ter de regravar as informações após excluí-las) poderia ser evitada.

Exemplos práticos

A seguir veremos dois exemplos de verificação do status da conexão. O primeiro mostra a forma mais básica, uma verificação “pontual”, onde o estado da conexão é avaliado apenas uma vez. No segundo exemplo, usamos um evento que é disparado sempre que a conexão é ativada/desativada, para manter uma mensagem atualizada na tela.

Então podemos criar uma aplicação para Windows Phone no Visual Studio (o código apresentado aqui é válido tanto para o SDK 7.1 quanto para o 8.0) e na página MainPage.xaml, alterar o conteúdo do Grid LayoutRoot conforme a Listagem 1.

Listagem 1: Grid LayoutRoot no primeiro exemplo

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="Verificar conexão" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="Conexão" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">            
        <Button Name="btnVerificarConexao" Content="Verificar Conexão" VerticalAlignment="Center" Click="btnVerificarConexao_Click"
/>
    </Grid>
</Grid>

Criamos um botão e referenciamos seu evento Click ao método btnVerificarConexao_Click, o que pode ser feito dando dois cliques sobre ele. No code behind, ou seja, no arquivo MainPage.xaml.cs esse método já deve ter sido criado e então podemos utilizar o código visto na Listagem 2.

Listagem 2: Verificando a conexão ao clicar no botão

private void btnVerificarConexao_Click(object sender, RoutedEventArgs e)
{
    if (NetworkInterface.GetIsNetworkAvailable())
    {
        MessageBox.Show("A conexão com a internet está ATIVA!");
    }
    else
    {
        MessageBox.Show("A conexão com a internet está INATIVA!");
    }
}

Observação: Para utilizar a classe NetworkInterface é necessária incluir a referência ao namespace System.Net.NetworkInformation na seção de usings da página.

Ao executar a aplicação temos o seguinte resultado:

Primeiro exemplo e execução

Figura 1: Primeiro exemplo e execução

No próximo exemplo vamos inserir um TextBlock para exibir uma mensagem constantemente na tela indicando se a conexão está ativa ou não. Então vamos alterar o conteúdo do Grid LayoutRoot conforme a listagem abaixo.

Listagem 3: Grid LayoutRoot para o segundo exemplo

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="Verificar conexão" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="Conexão" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">            
        <TextBlock Name="lblConexao" Text="Conexão com a internet" VerticalAlignment="Center" FontSize="40" HorizontalAlignment="Center" TextWrapping="Wrap" TextAlignment="Center" />
    </Grid>
</Grid>

Dessa vez declararemos uma variável privada para armazenar o status da conexão que será atualizado constantemente no evento NetworkAddressChanged da classe NetworkChange. Esse evento é disparado sempre que o IP da interface de rede sofre alteração.

Novamente utilizaremos o método GetIsNetworkAvailable da classe NetworkInterface, conforme vemos no código C# da página MainPage, a seguir.

Listagem 4: Código da página MainPage para o segundo exemplo

public partial class MainPage : PhoneApplicationPage
{
    private bool internetConectada;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
        NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);
    }

    void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
    {
        internetConectada = NetworkInterface.GetIsNetworkAvailable();
        if (internetConectada)
        {
            lblConexao.Foreground = new SolidColorBrush(Colors.Green);
            lblConexao.Text = "Conectado à Internet";
        }
        else
        {
            lblConexao.Foreground = new SolidColorBrush(Colors.Red);
            lblConexao.Text = "Sem Conexão com a Internet";
        }
    }
}

Como se pode ver, a variável internetConectada pode ser acessada em qualquer ponto da classe, servindo para os fins já comentados nesse artigo.

O resultado desse código, ao executarmos a aplicação, é apresentado a seguir.

Segundo exemplo em execução

Figura 2: Segundo exemplo em execução

Conclusão

Em geral a base para verificar a conexão está no método GetIsNetworkAvailable, como vimos nos códigos acima. Cabe ao leitor decidir qual é o melhor ponto e momento para utilizar esse recurso.

Até o próximo artigo.