3 августа 2013 в 12:23

Простой пример использования библиотеки Volley перевод

Я уверен вы, еще не слышали слово «Volley», это библиотека, представленная на Google I/O 2013 Ficus Kirkpatrick.

Для чего библиотека Volley?


Volley это библиотека, которая делает сетевые приложения для Android проще и, самое главное, быстрее.

Она управляет обработкой и кэшированием сетевых запросов, и это экономит драгоценное время разработчиков от написания одного и того же кода сетевого запроса/считывания из кэша снова и снова. И еще одно преимущество, меньше кода, меньше количество ошибок :)

Обычно мы пишем один и тот же код сетевого запроса в AsyncTask, логику обработки ответа от Web API и отображения его в View. Мы должны заботиться об отображении ProgressBar/ProgressDialog внутри OnsourceExecute() и OnPostExecute(). Я знаю, что это не трудная задача, но все же рутинная. Иногда бывает скучно, даже когда определен базовый класс для управления ProgressBar/ProgressDialog и многими другими вещами. Так что теперь можно сказать, Volley может быть мощной альтернативой AsyncTask.

Преимущества использования Volley:


  1. Volley автоматически составляет все сетевые запросы. Volley будет принимать на себя все сетевые запросы вашего приложения выполнять их для извлечения ответа или изображения с веб-сайтов.
  2. Volley обеспечивает прозрачность дискового кэширования и кэширования в памяти.
  3. Volley обеспечивает мощное API для отмены запроса. Можно отменить один запрос или установить несколько запросов для отмены.
  4. Volley предоставляет мощные возможности изменения.
  5. Volley предоставляет инструменты отладки и трассировки.

Как начать?


  1. Клонируйте проект Volley.
    git clone https://android.googlesource.com/platform/frameworks/volley
    
  2. Импортируйте код в ваш проект.

2 главных класса Volley


Есть 2 основных класса:
  1. Request queue
  2. Request

Request queue: используется для отправки сетевых запросов, можете создавать класс request queue, где хотите, но, как правило его создают во время запуска и используют как Singleton.

Request: он содержит все необходимые детали для создания вызова Web API. Например: какой метод использовать (GET или POST), данные запроса, response listener, error listener.

Взгляните на метод JSONObjectRequest:
    /**
     * Creates a new request.
     * @param method the HTTP method to use
     * @param url URL to fetch the JSON from
     * @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and
     *   indicates no parameters will be posted along with request.
     * @param listener Listener to receive the JSON response
     * @param errorListener Error listener, or null to ignore errors.
     */
    public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
            Listener<JSONObject> listener, ErrorListener errorListener) {
        super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
                    errorListener);
    }

    /**
     * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is
     * <code>null</code>, <code>POST</code> otherwise.
     *
     * @see #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener)
     */
    public JsonObjectRequest(String url, JSONObject jsonRequest, Listener<JSONObject> listener,
            ErrorListener errorListener) {
        this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest,
                listener, errorListener);
    }

Простой пример использования Volley:


Я надеюсь вы уже клонировали/скачали библиотеку Volley из Git репозитория. Теперь следуйте инструкциям, что бы создать простой пример извлечения JSON ответа.

Шаг 1: Убедитесь что вы импортировали проект Volley в Eclipse. Теперь после импорта мы должны сделать проект библиотекой (Library project), правой кнопкой мыши => Properties => Android (левая панель).

volley as a library project

Шаг 2: Создайте новый проект VolleyExample.

Шаг 3: Правый клик на VolleyExample и включите библиотеку Volley в ваш проект.

Including volley library in Android project

Шаг 4: Включите разрешение на использование интернета в файле AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

Шаг 5:
5.1 Создайте объект класса RequestQueue

RequestQueue queue = Volley.newRequestQueue(this);

5.2 Создайте JSONObjectRequest с response и error listener.

String url = "https://www.googleapis.com/customsearch/v1?key=AIzaSyBmSXUzVZBKQv9FJkTpZXn0dObKgEQOIFU&cx=014099860786446192319:t5mr0xnusiy&q=AndroidDev&alt=json&searchType=image";

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

  @Override
  public void onResponse(JSONObject response) {
   // TODO Auto-generated method stub
   txtDisplay.setText("Response => "+response.toString());
   findViewById(R.id.progressBar1).setVisibility(View.GONE);
  }
 }, new Response.ErrorListener() {

  @Override
  public void onErrorResponse(VolleyError error) {
  // TODO Auto-generated method stub

  }
 });


5.3 Добавьте ваш request в RequestQueue.
queue.add(jsObjRequest);

Весь код файла MainActivity.java
package com.technotalkative.volleyexamplesimple;

import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

public class MainActivity extends Activity {

 private TextView txtDisplay;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  txtDisplay = (TextView) findViewById(R.id.txtDisplay);

  RequestQueue queue = Volley.newRequestQueue(this);
  String url = "https://www.googleapis.com/customsearch/v1?key=AIzaSyBmSXUzVZBKQv9FJkTpZXn0dObKgEQOIFU&cx=014099860786446192319:t5mr0xnusiy&q=AndroidDev&alt=json&searchType=image";

  JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

   @Override
   public void onResponse(JSONObject response) {
    // TODO Auto-generated method stub
    txtDisplay.setText("Response => "+response.toString());
    findViewById(R.id.progressBar1).setVisibility(View.GONE);
   }
  }, new Response.ErrorListener() {

   @Override
   public void onErrorResponse(VolleyError error) {
    // TODO Auto-generated method stub

   }
  });

  queue.add(jsObjRequest);

 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is sourcesent.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}

Автор оригинала: Paresh Mayani
Gar|k @Gariks
карма
23,0
рейтинг 0,0
Похожие публикации
Самое читаемое Разработка

Комментарии (14)

  • 0
    Какой мин. target sdk для этой библиотеки? Не 4.2.2 же?)
  • +1
    Я уверен вы, еще не слышали слово «Volley»

    Ну почему же, слышал. Я сейчас пользуюсь библиотекой DataDroid уважаемого товарища foxykeep. Штука просто отличная, очень советую. Каждая операция выносится в свой класс, запросы формируются с помощью класса-билдера Request, который сам по себе очень удобен для передачи между процессами и экранами, так как является Parcelable. Можно легко сделать повторение запроса, просто переслав этот же Request.

    Без допила конечно не обошлось, там он использует для своих Listeners WeakReference, которые мрут как мухи. Ну и совместимость с 2.3 подпилил, HttpUrlConnection почему-то не шлет Content-Lenght по умолчанию. Сделаю чуть позже форк.
    • 0
      Еще там вроде нет поддержки cookie.
      • 0
        А вот это уже серьезный минус(
  • +1
    Сам недавно написал библиотеку по работе с REST / JSON API. Таких библиотек кучи, хотелось свой велосипед с удобным интерфейсом.
    https://github.com/kodart/Httpzoid

    Для ленивых приложу пример использования:

    Http http = HttpFactory.create(context);
    http.post("http://example.com/users")
        .data(new User("John"))
        .send();
    


    Тут мы имеем POST запрос на создание объекта User
    Вся работа строится с использованием типизированых объектов а не JSONObject.
    Если нужно будет прикурутить кеширование то думаю это не сложно.
    • НЛО прилетело и опубликовало эту надпись здесь
      • +1
        Из него вытаскивается ConnectivityManager сервис для контроля online / offline статуса.
  • 0
    С прогрессбаром на мой взгляд как-то не очень все очевидно и прозрачно. Да и в статье не видно ссылки на документацию и описание всех фич библиотеки. Но в целом спасибо, погуглю, поизучаю :)
  • +2
    Android query выглядит:
    — легче
    — удобнее
    — мощнее
    • 0
      тоже использовал в нескольки проектах aQuery действительно оочень крутая библиотка. Volley пока какая то сырая и не очень функциональная, все равно придется дописывать.
  • +5
    Volley вызывет у меня чуть большее негодование, чем авторы, оставляющие в коде // TODO Auto-generated method stub.

    Они предлагают вместо ImageView использовать NetworkImageView и вызывать public void setImageUrl(...). Это ужасный дизайн, когда вьюха привязывается к источнику данных.

    Ещё про картинки. Они не используют inBitmap. Хотя это известный вопрос, ему даже посвящён выпуск DevBytes.

    Затем, c json они делают ту же глупость, что и создатель android-async-http: объект загружается в фоне, но возвращается в UI потоке. Т.е. вся работа с json будет уже в main thread. Ну или же нужно запускать что-то (типа AsyncTask), что обработает его в фоне.

    LruCache? Не, не слышали. Вообще, складывается впечатление, что у них была задача написать либу с минимальным использованием стандартных компонент Android. И свалить всё в кучу.

    VolleyError(и его наследники), который на самом деле не Error, а Exception.

    В общем, по моему мнению, эта либа — пример посредственного дизайна, и лучше бы она из недр Play Store не вылазила.
  • 0
    Как тут выше уже отмечали, у нее нет нормальной доки, и нормальный ресурс, где бы можно было посмотреть текущую стабильную версию и пр, Ficus сделать не озаботился, и это грустно.

    Было бы интересно посмотреть сравнения с уже известными аналогичными либами, типа android-async-http или Android-query. А то неясно, чего уж там такого необычного, все перечисленное в том или ином виде есть в существующих решениях.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.