Выполнение стандартного запроса

Этот урок научит вас

  1. Запрос изображения
  2. Запрос JSON

Видео

Volley: простой и быстрый сетевой обмен для Android

Этот урок описывает, как использовать общие типы запросов, которые поддерживает Volley:

  • StringRequest. Укажите URL и получите ответ в виде строки. Смотрите Настройка очереди запросов в качестве примера.
  • ImageRequest. Укажите URL и получите изображение в ответ.
  • JsonObjectRequest и JsonArrayRequest (оба подклассы JsonRequest). Укажите URL и получите JSON объект или массив (соответственно) в ответ.

Если ваш ожидаемый ответ является одним из этих типов, вам, вероятно, не придется реализовать собственный запрос. Этот урок описывает, как использовать эти стандартные типы запросов. Для получения информации о том, как реализовать свой собственный пользовательский запрос, см. Реализация пользовательского запроса.

Запрос изображения

Volley предлагает следующие классы для запроса изображений. Эти классы являются слоями поверх друг друга и предоставляют различные уровни поддержки для обработки изображений:

  • ImageRequest— запрос на получение изображения по заданному URL и обратным вызовом с декодированным растровым изображением. Он также предоставляет удобные функции, такие как указания размера, к которому необходимо масштабировать. Его основным преимуществом является то, что поток планирования Volley гарантирует, что дорогие операции с изображением (декодирование, изменение размера) автоматически выполняются в рабочем потоке.
  • ImageLoader— вспомогательный класс, который обрабатывает загрузку и кэширование изображений с удаленных адресов. ImageLoader является дирижером для большого числа ImageRequest, например, при помещении нескольких миниатюр в ListView. ImageLoader предоставляет кэш в памяти, который расположен перед обычным кэшем Volley, что важно для предотвращения мерцания. Это дает возможность получение из кэша без блокировки основного потока, что невозможно при использовании дискового ввода/вывода. ImageLoader также выполняет группировку ответов, без которой почти каждый обработчик ответов будет задавать по одному растровому изображению для представления, что приведет к перестроению макета для каждого изображения. Группировка позволяет доставить несколько ответов одновременно, что повышает производительность.
  • NetworkImageView— основывается на ImageLoader и эффективно заменяет ImageView в ситуациях, когда ваша картинка в настоящее время передаётся по сети через URL. NetworkImageView также управляет отменой ожидающих выполнения запросов, если представление удаляется из иерархии.

Использование ImageRequest

Вот пример использования ImageRequest. Он получает изображение, указанное в URL, и отображает его в приложении. Обратите внимание, что этот фрагмент взаимодействует с RequestQueue через класса "одиночку" (см. Настройка RequestQueue для более детального обсуждения этой темы):

ImageView mImageView;
String url = "http://i.imgur.com/7spzG.png";
mImageView = (ImageView) findViewById(R.id.myImage);
...

// Retrieves an image specified by the URL, displays it in the UI.
ImageRequest request = new ImageRequest(url,
    new Response.Listener
       
        () {
        @Override
        public void onResponse(Bitmap bitmap) {
            mImageView.setImageBitmap(bitmap);
        }
    }, 0, 0, null,
    new Response.ErrorListener() {
        public void onErrorResponse(VolleyError error) {
            mImageView.setImageResource(R.drawable.image_load_error);
        }
    });
// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(request);
       

Использование ImageLoader и NetworkImageView

Вы можете использовать ImageLoader и NetworkImageView совместно для эффективного управления отображением нескольких изображений, например, в ListView. В XML файле макета, вы используете NetworkImageView во многом так же, как вы бы использовали ImageView, например:

<com.android.volley.toolbox.NetworkImageView
        android:id="@+id/networkImageView"
        android:layout_width="150dp"
        android:layout_height="170dp"
        android:layout_centerHorizontal="true" />

Вы можете использовать ImageLoader сам по себе для отображения изображения, например:

ImageLoader mImageLoader;
ImageView mImageView;
// The URL for the image that is being loaded.
private static final String IMAGE_URL =
    "http://developer.android.com/images/training/system-ui.png";
...
mImageView = (ImageView) findViewById(R.id.regularImageView);

// Get the ImageLoader through your singleton class.
mImageLoader = MySingleton.getInstance(this).getImageLoader();
mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,
         R.drawable.def_image, R.drawable.err_image));

Однако, NetworkImageView может сделать это для вас, если все что вы делаете это заполнение ImageView. Например:

ImageLoader mImageLoader;
NetworkImageView mNetworkImageView;
private static final String IMAGE_URL =
    "http://developer.android.com/images/training/system-ui.png";
...

// Get the NetworkImageView that will display the image.
mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);

// Get the ImageLoader through your singleton class.
mImageLoader = MySingleton.getInstance(this).getImageLoader();

// Set the URL of the image that should be loaded into this view, and
// specify the ImageLoader that will be used to make the request.
mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);

Вышеуказанные фрагменты обращаются к RequestQueue и ImageLoader через класс "одиночку", как описано в разделе Настройка RequestQueue. Такой подход гарантирует, что ваше приложение создаст единственные экземпляры этих классов, которые проживут до завершения вашего приложения. Это важно для ImageLoader (вспомогательный класс, который управляет загрузкой и кэшированием изображений), потому что основная задача кэша в памяти это позволить выполнить вращение без мерцания. Использование шаблона "одиночка" позволяет кэшу растровых изображений пережить деятельность. Если вместо этого вы создадите ImageLoader в деятельности, ImageLoader будет пересоздаваться вместе с деятельностью каждый раз, когда пользователь поворачивает устройство. Это может привести к мерцанию.

Пример LRU кэша

Volley инструменты предоставляют стандартную реализацию кэша с помощью DiskBasedCache класса. Этот класс кэширует файлы непосредственно на жестком диске в указанном каталоге. Но чтобы использовать ImageLoader, вы должны обеспечить пользовательский растровый LRU кэш в-памяти, реализующий ImageLoader.ImageCache интерфейс. Вы можете настроить кэш как "одиночку"; более детального обсуждения этой теме см. Настройка RequestQueue.

Вот пример реализации для хранения в памяти LruBitmapCache класса. Он расширяет LruCache класс и реализует ImageLoader.ImageCache интерфейс:

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.util.DisplayMetrics;
import com.android.volley.toolbox.ImageLoader.ImageCache;

public class LruBitmapCache extends LruCache<String, Bitmap>
        implements ImageCache {

    public LruBitmapCache(int maxSize) {
        super(maxSize);
    }

    public LruBitmapCache(Context ctx) {
        this(getCacheSize(ctx));
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight();
    }

    @Override
    public Bitmap getBitmap(String url) {
        return get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }

    // Returns a cache size equal to approximately three screens worth of images.
    public static int getCacheSize(Context ctx) {
        final DisplayMetrics displayMetrics = ctx.getResources().
                getDisplayMetrics();
        final int screenWidth = displayMetrics.widthPixels;
        final int screenHeight = displayMetrics.heightPixels;
        // 4 bytes per pixel
        final int screenBytes = screenWidth * screenHeight * 4;

        return screenBytes * 3;
    }
}

Вот пример того, как создать экземпляр ImageLoader для использования этого кэша:

RequestQueue mRequestQueue; // assume this exists.
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(
            LruBitmapCache.getCacheSize()));

Запрос JSON

Volley предоставляет следующие классы для JSON запросов:

  • JsonArrayRequest— Запрос на получение JSONArray ответа по заданному URL.
  • JsonObjectRequest— Запрос на получение JSONObject ответа по заданному URL, что позволяет дополнительный JSONObject передать в качестве части тела запроса.

Оба класса основываются на общем базовом классе JsonRequest. Вы используете их по той же базовой модели, которую вы используете для других типов запросов. Например, этот фрагмент получает JSON канал и отображает его в виде текста в пользовательском интерфейсе:

TextView mTxtDisplay;
ImageView mImageView;
mTxtDisplay = (TextView) findViewById(R.id.txtDisplay);
String url = "http://my-json-feed";

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

    @Override
    public void onResponse(JSONObject response) {
        mTxtDisplay.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {

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

    }
});

// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);

       
В качестве примера реализации пользовательских JSON запросов на основе GSON , см. следующий урок, Реализация пользовательского запроса.