Entendendo Threads
Nesse capitulo nos iremos entender um pouco de como trabalhar com Threads no android.
Uma thread basicamente é uma forma de executarmos tarefas em segundo plano ou background, ou seja nos podemos executar varias tarefas em background enquanto o usuario esta navegando na nossa aplicação, mas temos que ter cuidado com as ações que iremos executar para não consumir muito recurso do aparelho do usuario.
Um exemplo de utilização de threads no android é para realizar conexões com o servidor, ou seja, acessar a internet, pois o android não permite realizar essas oprações na thread principal.
Para criamos uma thread no nosso aplicativo nos iremos utilizar uma classe chamada Thread, para criamos uma thread nos temos que implementar uma interface chamada Runnable, essa classe é a responsavel por implementar um metodo chamado run(), que é onde nos iremos colocar o codigo que sera executado em segundo plano.
No Android quando a nossa aplicação é aberta, ela abre uma thread de execução chamada de thread principal ou UI Thread que vincula a atividade ao nosso layout. No android existe algumas regras em relação a thread principal, para alterar alguma view ou seja acessar a thread principal do nosso app a partir de uma thread secundaria nos temos que acessar a thread principal, para acessar a thread principal a partir de uma thread secundaria nos temos que utilizar um metodo chamado runOnUiThread.
O Metodo runOnUiThread nos iremos chamar ele dentro do metodo run() na thread que abrimos, o metodo runOnUiThread ele implementa a interface Runnable que implementar o metoto run() igual a nossa thread, nesse metodo nos podemos alterar qualquer elemento da nossa view.
Nos iremos criar um exemplo utilizando threads, o que iremos fazer é baixar uma imagem da internet e colocar em um ImageView. Para baixar a imagem nos iremos utilizar uma classe de conexão HTTP que iremos ver com mais detalhes na proxima aula.
Vamos criar o nosso projeto agora.
Vamos agora adicionar a permissão de acesso a internet no nosso arquivo AndroidManifest.xml, para adicionar essa permisão, basta adicionar o seguinte codigo.
<uses-permission android:name="android.permission.INTERNET"/>
Vamos agora realizar algumas modificações no nosso layout, vamos adicionar um Button e um ImageView.
Agora vamos voltar a nossa MainActivity, e vamos criar a referencia do nosso ImageView e do nosso Button, e vamos criar o onClick do button.
Agora vamos criar o nosso metodo onde iremos implementar a nossa thread, para implementar a nossa thread nos iremos dar um new na classe Thread, e por parametros iremos colocar a nossa interface Runnable que ira sobreescrever o metodo chamado run(). Para iniciar a thread basta adicionarmos o metodo .start().
Agora vamos adicionar o seguinte codigo no metodo run da nossa thread, o codigo abaixo realiza a seguinte operação, na primeira linha nos vamos criar um objeto do tipo URL passando como parametro a nossa url da imagem que iremos baixar, na segunda linha nos iremos abrir a nossa conexão para a url que nos criamos, na terceira linha nos iremos começar a baixar a imagem, na quarta linha nos iremos decodificar o nosso InputStream em um tipo Bitmap para podermos colocar a imagem no nosso ImageView.
Vamos agora chamar esse nosso metodo baixarImage() no evento do clique do nosso Button e vamos verificar o nosso logcat para saber se baixou ou não a nossa imagem.
Agora vamos colocar a imagem que acabamos de baixar no nosso imageView, para realizar essa operação é preciso acessar a UI Thread, para acessa a UI Thread nos temos que adicionar o metodo runOnUIThread dentro do metodo run da nossa Thread.
Agora vamos colocar o nosso Bitmap na nossa imageView, quando colocarmos o nosso bitmap no nosso ImageView o android ira reclamar e pedir para transformar o nosso objeto Bitmap em final.
Agora vamos executar a nossa aplicação e vamos ver o seu funcionamento.
Vamos agora realizar uma pequena alteração no nosso projeto, para não dar uma impressão de que a aplicação travou ao usuario, vamos adicionar um ProgressDialog no nosso projeto, com o ProgressDialog nos iremos informar ao usuario que a nossa aplicação esta realizando alguma atividade e ele tem que esperar essa atividade ser finalizada, nos iremos ativar o ProgressDialog antes de iniciar a nossa thread, e iremos finalizar dentro do metodo run() do nosso runOnUIThread ou quando der erro no download da nossa imagem no nosso catch.
Agora vamos executar novamente a nossa aplicação e verificar o seu funcionamento.