Ravakahn Gladior
Ravakahn Gladior Ravakahn foi um gladiador que, na Roma Antiga, lutava com outros gladiadores ou animais, às vezes, até a morte, para o entretenimento do público romano. há 4 anos

Networking com a biblioteca Volley no Android

Networking com a biblioteca Volley no Android

Volley é uma biblioteca que torna a navegação para Android mais fácil, e mais importante, rápida. A Biblioteca Volley foi anunciada por Ficus Kirkpatrick no Google I/O 2013. Ela foi usada pela primeira vez no aplicativo Play Store e então foi lançado como uma biblioteca open-source. Embora faça parte do Android Open Source Project (AOSP), o Google anunciou em janeiro de 2017 que o Volley passará a ser uma biblioteca independente.

Sumário

Por que Volley?

  • Volley pode praticamente fazer tudo o que tem a ver com navegação no Android;
  • Volley fornece cache em disco e memória transparente;
  • Volley fornece uma API de cancelamento de requisições para cancelar uma única solicitação ou você pode definir blocos de requisições para cancelar;
  • Volley fornece habilidades para customização;
  • Volley fornece ferramentas de depuração e rastreamento.

Configuração do Volley

Adicionar Volley ao arquivo app/build.gradle:

dependencies {
    implementation 'com.android.volley:volley:1.1.0'
}

E adicionar permissão de navegação na internet em AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.simplenetworking"
    android:versionCode="1"
    android:versionName="1.0" >

   <!-- Add permissions here -->
   <uses-permission android:name="android.permission.INTERNET" /> 
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

</manifest>

Como usar o Volley?

Volley tem duas classes com as quais você terá que lidar:

  1. RequestQueue - As requisições são enfileirados aqui para serem processados;
  2. Request (e suas extensões) - Construindo uma requisição

Existem quatro principais tipos de requisições:

  • JsonObjectRequest: Para enviar e receber objetos JSON do servidor;
  • JsonArrayRequest: Para receber um array JSON do servidor;
  • ImageRequest: Para receber uma imagem do servidor;
  • StringRequest: Para recuperar o conteúdo da resposta como uma String (ideal se você pretende analisar a resposta)

Construindo uma RequestQueue

Todas as solicitações no Volley são colocadas em uma fila primeiro e depois processadas. Eis como você criará uma fila de solicitações:

public MainActivity extends Activity {
    private RequestQueue mRequestQueue;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_screen_layout);
        // ...
        mRequestQueue = Volley.newRequestQueue(this);
    }
}

Criando uma fila com Singleton

Consulte este guia para criar uma fila com singleton.

Requisitando imagens

Volley oferece a capacidade de criar solicitações de imagem e receber de volta como bitmap. Você pode usar esse bitmap para definir diretamente em um ImageView.

ImageRequest imageRequest = new ImageRequest("https://i.imgur.com/Nwk25LA.jpg",
  new Response.Listener<Bitmap>() {
    @Override
    public void onResponse(Bitmap response) {

    },
    // Imagem com largura & altura 0 significa usar o tamanho da imagem
    0, 0,
    // Tipo de escala
    ImageView.ScaleType.FIT_XY,
    // 8 bytes per pixel image
    Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError error) {
        error.printStackTrace();
      }
    });

Acessando dados em JSON

Após este passo, você estará pronto para criar seus objetos Request, o que representa uma requisição a ser executada. Em seguida, adicionamos essa requisição à fila.

public class MainActivity extends Activity {
    private RequestQueue mRequestQueue;

        // ...

    private void fetchJsonResponse() {
        // Passar NULL no segundo argumento para requisições GET
        JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, "http://ip.jsontest.com/", null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        String result = "Your IP Address is " + response.getString("ip");
                        Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.e("Error: ", error.getMessage());
                }
        });

        /* Adicionar sua Requests ao RequestQueue para executar */
        mRequestQueue.add(req);
    }
}

E isso irá enviar a requisição ao servidor, que responderá de volta com o resultado, conforme especificado na função de retorno Response.Listener. Para uma visão mais detalhada do Volley, confira este tutorial de vôlei.

Cancelando requisições

Você pode adicionar uma tag na requisição:

StringRequest stringRequest = ...;
RequestQueue mRequestQueue = ...;

// Set the tag on the request.
stringRequest.setTag(TAG);

// Add the request to the RequestQueue.
mRequestQueue.add(stringRequest);

Agora você pode cancelar todas as solicitações com essa tag chamando o método cancelAll na fila de requisições:

@Override
protected void onStop() {
    super.onStop();
    if (mRequestQueue != null) {
        mRequestQueue.cancelAll(TAG);
    }
}

Usando com OkHttp

Embora o Volley use a interface HttpUrlConnection para chamadas de rede, a biblioteca OkHttp pode ser usada, pois também fornece uma implementação dessa interface:

public class OkHttpStack extends HurlStack {
  private final OkHttpClient client;

  public OkHttpStack() {
    this(new OkHttpClient());
  }

  public OkHttpStack(OkHttpClient client) {
    if (client == null) {
      throw new NullPointerException("Client must not be null.");
    }
    this.client = client;
  }

  @Override protected HttpURLConnection createConnection(URL url) throws IOException {
    return client.open(url);
  }   
}

Você pode gerar uma fila de pedidos:

Volley.newRequestQueue(context, new OkHttpStack());

Veja este gist para mais informações.

Solução de problemas

You can enable verbose logging by simplify setting VolleyLog.DEBUG to be true before issuing network requests:

Você pode ativar o registro detalhado definindo VolleyLog.DEBUG para true antes de fazer requisições de rede:

VolleyLog.DEBUG = true;

Você também pode ativar o log detalhado depois que um aplicativo já estiver em execução, digitando este comando no Android Debug Shell (ADB):

adb shell setprop log.tag.Volley VERBOSE

A saída irá mostrar ocorrências de cache, entradas nas filas, e latência da rede:

03-13 23:32:11.382 2565-2565/com.test D/Volley: [1] MarkerLog.finish: (1494 ms) [ ] https://i.imgur.com/Nwk25LA.jpg 0x189700ee LOW 1
03-13 23:32:11.382 2565-2565/com.test D/Volley: [1] MarkerLog.finish: (+0   ) [ 1] add-to-queue
03-13 23:32:11.382 2565-2565/com.test D/Volley: [1] MarkerLog.finish: (+85  ) [191] cache-queue-take
03-13 23:32:11.382 2565-2565/com.test D/Volley: [1] MarkerLog.finish: (+107 ) [191] cache-hit
03-13 23:32:11.383 2565-2565/com.test D/Volley: [1] MarkerLog.finish: (+957 ) [191] cache-hit-parsed
03-13 23:32:11.383 2565-2565/com.test D/Volley: [1] MarkerLog.finish: (+0   ) [191] post-response
03-13 23:32:11.383 2565-2565/com.test D/Volley: [1] MarkerLog.finish: (+345 ) [ 1] done

Referências