Java tutorial
/* * Copyright 2012 - Oficinapp * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package br.com.oficinapp.blog.restclient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.AlertDialog; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; /** * Atividade que ir realizar a pesquisa de estados em um servio REST, * utilizando a biblioteca Apache HttpClient e AsyncTask. * * @author Thiago Uriel M. Garcia (oficinapp@gmail.com.br) */ public class MainActivity extends ListActivity { /** Dilogo para tela de espera. */ private ProgressDialog progressDialog; /** Lifecycle: Atividade criada. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.state_list); ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); } }); } /** Lifecycle: Atividade reiniciada. */ @Override public void onResume() { // // Ir carregar a lista de estados. Esta tarefa em um cenrio real // talvez no deva estar ocorrendo sempre neste evento, mas para // facilitar a exibio, ficar aqui para fins acadmicos! // super.onResume(); new RequestStatesTask().execute("http://192.168.0.107:8080/dummyserver/rest/state"); } /** * Classe interna que criar um <i>worker</i> responsvel por obter estados * cadastrados via chamada HTTP, receber o JSON e process-lo. * * @author Thiago Uriel M. Garcia (oficinapp@gmail.com.br) */ private class RequestStatesTask extends AsyncTask<String, Void, String[]> { /** HTTP Client utilizado pela task. */ private final HttpClient httpclient = new DefaultHttpClient(); /** * Mtodo chamado antes de iniciar a tarefa. Ser executado dentro da * Thread de Interface. */ protected void onPreExecute() { // // Criar a barra de progresso indeterminado que ser exibida // durante a execuo do worker thread. // progressDialog = ProgressDialog.show(MainActivity.this, getString(R.string.progress_title), getString(R.string.progress_message), true, true); } /** Tarefa que ser realizada por um <i>worker thread</i>. */ @Override protected String[] doInBackground(String... params) { try { HttpGet get = new HttpGet(params[0]); get.setHeader("Accept", "application/json"); HttpResponse httpResponse = httpclient.execute(get); int receivedStatusCode = httpResponse.getStatusLine().getStatusCode(); if (receivedStatusCode == HttpStatus.SC_OK) { // // OK, recebemos a lista. Devemos process-la com os mtodos // de suporte e devolver o array de strings... // InputStream inputStream = httpResponse.getEntity().getContent(); String jsonData = toString(inputStream); return handleJson(jsonData); } else { // // Tivemos algum status diferente de HTTP 200 OK. Retornar // nulo e permitir que o mtodo ps-execuo notifique. // return null; } } catch (Exception exp) { Log.e(RequestStatesTask.class.getName(), "Erro obtendo estados.", exp); return null; } } /** * Mtodo chamado aps a concluso da tarefa. Este mtodo ser executado * dentro da Thread de Interface e receber os dados do processamento. */ protected void onPostExecute(String[] result) { // // Cancelar o medidor de progresso criado anteriormente e mostrar // o resultado obtido pela consulta. // progressDialog.dismiss(); setListAdapter(new ArrayAdapter<String>(MainActivity.this, R.layout.state_list_item, result)); // // Caso seja nulo, informar que ocorreu algum problema na obteno // dos dados solicitados. // if (result == null) { final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setCancelable(false).setTitle(R.string.alert_title).setMessage(R.string.alert_error) .setPositiveButton(R.string.alert_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { return; } }); final AlertDialog alert = builder.create(); alert.show(); } } /** * Converte o objeto <code>InputStream</code> recebido pela solicitao * HTTP, e converte-o para um objeto <code>String</code> contendo JSON. * * @param is Objeto <code>InputStream</code> de entrada. * @return Objeto <code>String</code> contendo o resultado JSON. */ private String toString(InputStream is) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "ISO8859-1")); StringBuilder builder = new StringBuilder(); for (String line = null; (line = reader.readLine()) != null;) { builder.append(line).append("\n"); } return builder.toString(); } /** * Transforma a String JSON recebida em um array de Strings. * * @param jsonData <code>String</code> contendo os dados JSON. * @return Resultado da converso dos dados. * * @throws JSONException * Caso ocorra algum problema na converso do JSON. */ private String[] handleJson(String jsonData) throws JSONException { JSONArray jsonArray = new JSONArray(jsonData); String[] states = new String[jsonArray.length()]; for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); states[i] = jsonObject.getString("shortName") + " - " + jsonObject.getString("name"); } return states; } } }