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.
- Ler os dados do banco local e criar um arquivo XML para envio;
- Apagar os dados locais para poupar espaço de armazenamento, uma vez que as informações estarão seguras no servidor que as receberá.
- 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" />
<TextBlock x:Name="PageTitle" Text="Conexão" Margin="9,-7,0,0" />
</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:
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" />
<TextBlock x:Name="PageTitle" Text="Conexão" Margin="9,-7,0,0" />
</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.
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.