Реализация пользовательского запроса

Видео

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

Этот урок описывает, как реализовывать собственные типы запросов, которые не реализованы в Volley.

Создание пользовательского запроса

Большинство запросов имеют готовые для использования реализации в панели инструментов; если ваш ответ является строкой, изображением или JSON, вам, вероятно, не нужно будет реализовать собственный Request.

Для случаев, когда вам нужно реализовать свой запрос, все что вам нужно сделать:

  • Расширить Request<T> класс, где <T> представляет типом разобранного ответа на запрос. Поэтому, если ваш разобранный ответ является строкой, например, создайте пользовательский запрос, расширив Request<String>. См. классы инструментов Volley StringRequest и ImageRequest в качестве примеров расширения Request<T>.
  • Реализуйте абстрактные методы parseNetworkResponse() и deliverResponse(), более подробно описанны ниже.

parseNetworkResponse

Response инкапсулирует проанализированный ответ для доставки, для данного типа (например, строку, изображение или JSON). Вот пример реализации parseNetworkResponse():

@Override
protected Response<T> parseNetworkResponse(
        NetworkResponse response) {
    try {
        String json = new String(response.data,
        HttpHeaderParser.parseCharset(response.headers));
    return Response.success(gson.fromJson(json, clazz),
    HttpHeaderParser.parseCacheHeaders(response));
    }
    // handle errors
...
}

Обратите внимание на следующее:

  • parseNetworkResponse() принимает в качестве параметра NetworkResponse, который содержит содержимое ответа в виде byte[], HTTP код состояния и заголовки ответа.
  • Ваша реализация должна возвращать Response<T>, который содержит свой типизированный объект ответа и метаданные кэша или ошибку, например, в случае ошибки при разборе.

Если ваш протокол имеет нестандартную семантику кэша, вы можете создать Cache.Entry самостоятельно, но большинство запросов что-то вроде этого:

return Response.success(myDecodedObject,
        HttpHeaderParser.parseCacheHeaders(response));

Volley вызывает parseNetworkResponse() из рабочего потока. Это гарантирует, что дорогие операции разбора, такие как декодирование JPEG в Bitmap, не будут блокировать поток пользовательского интерфейса.

deliverResponse

Volley вызовет ваш метод обратного вызова в главном потоке с объектом, который вы вернули в parseNetworkResponse(). Большинство запросов вызывают интерфейс обратного вызова здесь, например:

protected void deliverResponse(T response) {
        listener.onResponse(response);

Пример: GsonRequest

Gson это библиотека для преобразования Java объектов в и из JSON с помощью reflection. Вы можете определить Java объекты, которые имеют те же имена, что и соответствующие ключи JSON, передать объект класса Gson, и Gson будет заполнять поля для вас. Вот полная реализация запроса Volley, который использует Gson для разбора:

public class GsonRequest<T> extends Request<T> {
    private final Gson gson = new Gson();
    private final Class<T> clazz;
    private final Map<String, String> headers;
    private final Listener<T> listener;

    /**
     * Make a GET request and return a parsed object from JSON.
     *
     * @param url URL of the request to make
     * @param clazz Relevant class object, for Gson's reflection
     * @param headers Map of request headers
     */
    public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
            Listener<T> listener, ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        this.clazz = clazz;
        this.headers = headers;
        this.listener = listener;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return headers != null ? headers : super.getHeaders();
    }

    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String json = new String(
                    response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(
                    gson.fromJson(json, clazz),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        }
    }
}

Volley предоставляет готовые к использованию JsonArrayRequest и JsonArrayObject классы, если вы предпочитаете использовать данный подход. См. Использование стандартных типов запросов для получения дополнительной информации.