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
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>
Volley tem duas classes com as quais você terá que lidar:
RequestQueue
- As requisições são enfileirados aqui para serem processados;Request
(e suas extensões) - Construindo uma requisiçãoExistem quatro principais tipos de requisições:
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);
}
}
Consulte este guia para criar uma fila com singleton.
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();
}
});
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.
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);
}
}
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.
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