Em muitos momentos será necessário a comunicação com um servidor web para fazer a integração da aplicação mobile. Essa atividade deve ser feita em uma Thread separada da UI, entretanto precisamos dar um feedback para o usuário de que essa operação está sendo executada. Para esse tipo de tarefa o Android disponibiliza a classe AsyncTask. Ele permite configurar o que será feito antes, durante e depois da execução de uma tarefa.
No código eu vou acessar a página do dicionário Michaelis para obter a tradução de uma determinada palavra. No onClick do botão, estou iniciando uma nova AsyncTask. Notem que foi passado o conteúdo da caixa de texto como parâmetro pro método execute.
O método downloadArquivo baixará o conteúdo HTML que é gerado pelo site do Michaelis.
public class PrincipalActivity extends Activity implements OnClickListener { private String URL_TXT = "http://michaelis.uol.com.br/moderno/portugues/"+ "index.php?lingua=portugues-portugues&"+ "typeToSearchRadio=exactly&pagRadio=50&palavra="; private TextView txtHTML; private EditText edtTexto; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.teste_async); findViewById(R.id.button1).setOnClickListener(this); txtHTML = (TextView)findViewById(R.id.textView2); edtTexto = (EditText)findViewById(R.id.editText1); } public void onClick(View v) { new MinhaAsyncTask().execute( edtTexto.getText().toString()); } public String downloadArquivo(String url) { HttpURLConnection connection = null; InputStream is = null; ByteArrayOutputStream bos = null; String s = null; try { URL urlAddr = new URL(url); connection = (HttpURLConnection) urlAddr.openConnection(); connection.setRequestMethod("GET"); connection.setDoInput(true); connection.setDoOutput(false); connection.connect(); is = connection.getInputStream(); bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0 ) { bos.write(buffer, 0, length); } s = new String(bos.toByteArray(), "ISO-8859-1"); } catch (Exception e) { e.printStackTrace(); } finally { try { bos.close(); is.close(); connection.disconnect(); } catch (Exception e){} } return s; } class MinhaAsyncTask extends AsyncTask <String, Void, String> { private ProgressDialog progressDialog; protected void onPreExecute() { progressDialog = new ProgressDialog( PrincipalActivity.this); progressDialog.setMessage("Aguarde..."); progressDialog.show(); } protected String doInBackground(String... v) { String s = downloadArquivo( URL_TXT + v[0].toString()); return s; } protected void onPostExecute(String result) { txtHTML.setText(result); progressDialog.dismiss(); } } }
Nossa AsyncTask é declarado recebendo 3 valores genéricos. O primeiro é o tipo do dado que será passado como parâmetro na para o método que executará em segundo plano (doInBackground). O segundo é o tipo do dado que pode ser usado para enviar o progresso de alguma execução da thread background (onProgressUpdate). E o último é o tipo de retorno da ação que será realizada em segundo plano.
No nosso caso usamos: uma String, que será a palavra a ser buscada; Void, já que não usarei o progresso com números; e a String que será o HTML lido.
EDITADO 19/06/2012
Para o Android, toda aplicação que possa onerar ou por em risco os dados do usuário deve requerer uma permissão para pode utilizar determinado recurso. No caso da nossa aplicação é a permissão de acesso a internet. Adicione a permissão abaixo dentro da tag
<uses-permission android:name="android.permission.INTERNET" />
Esse post foi baseado no post sobre AsyncTask do blog Eu, Android e foi enviado pelo meu aluno Bruno Baudel. Qualquer dúvida, olhem o blog dos caras e deixem seus comentários.
4br4ç05,
nglauber
5 comentários:
Show de bola Glauber como sempre muito bem explicado seus topicos.
NAO ESQUECER DE COLOCAR A PERMISSÃO NO ARQUIVO ANDROID MANIFEST!
Oi Anônimo,
Obrigado por ter lembrado. Atualizei o post.
4br4ç05,
nglauber
Quando altera a orientação da tela o Progress desaparece...
Oi rike,
Esse é um comportamento esperado...
Dá uma olhada nesse link
http://nglauber.blogspot.com.br/2012/08/cuide-da-sua-asynctask.html
4br4ç05,
nglauber
Postar um comentário