Настройка RequestQueue

Видео

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

Предыдущий урок показал вам, как использовать удобный метод Volley.newRequestQueue для настройки RequestQueue, воспользовавшись поведения Volley по умолчанию. Этот урок проведет вас по шагам создания RequestQueue, чтобы позволить вам предоставить собственное пользовательское поведение.

Этот урок также описывает рекомендуемую практику создания RequestQueue используя шаблон "одиночка", что позволяет RequestQueue оставаться работающей до конца жизненного цикла вашего приложения.

Настройка сети и кэша

RequestQueue нужны две вещи, чтобы выполнять свою работу: сеть для выполнения запросов и кэш для кэширования. Стандартные реализации доступны в панели инструментов Volley: DiskBasedCache кэширует каждый ответ, сохраняя в отдельный файл, храня индекс в памяти, и BasicNetwork обеспечивает сетевой транспорт на основе вашего выбора AndroidHttpClient или HttpURLConnection.

BasicNetwork является реализацией сети по умолчанию в Volley. BasicNetwork должен быть проинициализирован HTTP клиентом, который ваше приложение использует для подключения к сети. Обычно это AndroidHttpClient или HttpURLConnection:

  • Используйте AndroidHttpClient для приложений, ориентированных на Android API уровня ниже, чем API Level 9 (Gingerbread). До Gingerbread, HttpURLConnection был ненадежным. Более детального обсуждения этой темы см. HTTP клиенты Android.
  • Используйте HttpURLConnection для приложений, ориентированных на Android API Level 9 (Gingerbread) и выше.

Чтобы создать приложение, которое работает на всех версиях Android, вы можете проверить версию Android устройства и выбрать соответствующий HTTP клиент, например:

HttpStack stack;
...
// If the device is running a version >= Gingerbread...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
    // ...use HttpURLConnection for stack.
} else {
    // ...use AndroidHttpClient for stack.
}
Network network = new BasicNetwork(stack);

Этот фрагмент показывает этапы настройки RequestQueue:

RequestQueue mRequestQueue;

// Instantiate the cache
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap

// Set up the network to use HttpURLConnection as the HTTP client.
Network network = new BasicNetwork(new HurlStack());

// Instantiate the RequestQueue with the cache and network.
mRequestQueue = new RequestQueue(cache, network);

// Start the queue
mRequestQueue.start();

String url ="http://www.myurl.com";

// Formulate the request and handle the response.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
        new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        // Do something with the response
    }
},
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // Handle error
    }
});

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

Если вам просто нужно сделать одноразовый запрос и вы не хотите оставлять пул потоков, вы можете создать RequestQueue , где это необходимо, и вызвать stop() на RequestQueue как только вы получили ответ или ошибку, использование Volley.newRequestQueue() метода описанно в Отправка простого запроса. Но больше общим случаем использования является создание RequestQueue как "одиночку", чтобы держать в работающем состоянии в течение всего срока жизнедеятельности вашего приложения, как описано в следующем разделе.

Используйте шаблон "Одиночка"

Если ваше приложение постоянно использует сеть, то, вероятно, наиболее эффективным является создание одного экземпляра RequestQueue , который будет жить до окончания работы вашего приложения. Вы можете добиться этого различными способами. Рекомендуемый подход заключается в реализации класса "одиночки", который инкапсулирует RequestQueue и другую Volley функциональность. Другой подход заключается в создании подкласса Application и настройке RequestQueue в Application.onCreate(). Но этот подход лишен смысла; статический объект "одиночка" может обеспечить ту же функциональность более модульным способом.

Ключевая концепция в том, что RequestQueue должен быть проинициализирован в Application контексте, а не Activity контексте. Это гарантирует, что RequestQueue будет жив в течение всего периода работы вашего приложения, вместо того, чтобы пересоздавать каждый раз, когда деятельность воссоздается (например, когда пользователь поворачивает устройство).

Вот пример класса "одиночки", предоставляющего RequestQueue и ImageLoader функциональность:

private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;

    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
            private final LruCache<String, Bitmap>
                    cache = new LruCache<String, Bitmap>(20);

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

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

    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}

Вот некоторые примеры выполнения RequestQueue операций с использованием класса "одиночки":

// Get a RequestQueue
RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
    getRequestQueue();
...

// Add a request (in this example, called stringRequest) to your RequestQueue.
MySingleton.getInstance(this).addToRequestQueue(stringRequest);