Volley – последовательные запросы вместо параллельных?

Я использую volley для получения HTTP запросов из моего приложения Android. Вот код, который я использую:

 public class RequestPool { private static RequestPool mInstance; private RequestQueue mRequestQueue; private static Context mContext; private RequestPool(Context context) { mContext = context; mRequestQueue = getRequestQueue(); } public static synchronized RequestPool getInstance(Context context) { if (mInstance == null) { mInstance = new RequestPool(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(mContext.getApplicationContext()); } return mRequestQueue; } public <T> void addToRequestQueue(Request<T> req) { getRequestQueue().add(req); } } 

Я хочу добавить запросы в очередь, но контролировать способ их выполнения, например:

Добавив несколько запросов в пул в произвольное время, пул выполнит только первый запрос (глава очереди), а затем, когда закончит выполнение следующего … и так далее ….

Может быть, есть способ сделать выполнение как серийных, так и параллельных запросов?

Является ли это возможным?

Благодарю.

Это можно сделать, создав запрос с пулом потоков как 1.

 int MAX_SERIAL_THREAD_POOL_SIZE = 1; final int MAX_CACHE_SIZE = 2 * 1024 * 1024; //2 MB private static RequestQueue prepareSerialRequestQueue(Context context) { Cache cache = new DiskBasedCache(context.getCacheDir(), MAX_CACHE_SIZE); Network network = getNetwork(); return new RequestQueue(cache, network, MAX_SERIAL_THREAD_POOL_SIZE); } 

В методе getNetwork ()

 private static Network getNetwork() { HttpStack stack; String userAgent = "volley/0"; if(Build.VERSION.SDK_INT >= 9) { stack = new HurlStack(); } else { stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent)); } return new BasicNetwork(stack); } 

И мы запускаем метод start () очереди запросов.

 RequestQueue serialRequestQueue = prepareSerialRequestQueue(context); serialRequestQueue.start(); 

Теперь добавьте запрос в эту очередь в очередь запросов очереди. Например:

 StringRequest requestOne = new StringRequest(Request.Method.GET, "http://www.example1.com", this, this); StringRequest requestTwo = new StringRequest(Request.Method.GET, "http://www.example2.com", this, this); StringRequest requestThree = new StringRequest(Request.Method.GET, "http://www.example3.com", this, this); serialRequestQueue.add(requestTwo); serialRequestQueue.add(requestOne); serialRequestQueue.add(requestThree); 

В этом случае requestTwo результата будет обрабатываться сначала, а затем requestOne и requestThree соответственно. Это помогает, если вы не хотите блокировать обработку запроса, а также заставляете их выполнять серийно.

Если вы хотите запускать параллельные запросы, вы просто добавляете запросы в очередь. Запросы по умолчанию асинхронны.

Если вы хотите запускать последовательные запросы, существует два подхода.

Один заключается в том, чтобы добавить второй запрос в onResponse первого запроса. Это будет в основном цепочка нескольких асинхронных запросов.

Два – использовать RequestFuture который блокирует. Например, выполнение этого метода будет блокироваться до получения ответа.

 private String blockingRequest(String url) { RequestFuture<String> future = RequestFuture.newFuture(); StringRequest sr = new StringRequest(url, future, future); queue.add(sr); String response = null; try { response = future.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } return response; } 

Для использования в основном вы ставите несколько методов запроса блокировки следующим образом:

 String response1 = blockingRequest1(url1); // other methods String response2 = blockingRequest2(url2); 

blockingRequest2 будет выполнен после завершения blockingRequest1 . Без будущего оба метода будут выполняться одновременно. Излишне говорить, что вам нужно будет запускать методы блокировки, а не в потоке пользовательского интерфейса (например, Thread, AsyncTask и личное избранное RxJava Observable).

Intereting Posts
Ошибка камеры 100 Подробнее Как я могу получить рабочую вертикальную SeekBar в Android? Как получить включенные представления с Android Databinding? Символы Unicode, отображаемые неправильно на мобильных устройствах Android OS 2.2 Разрешения: У меня нет абсолютно никакой идеи, почему этот простой кусок кода не работает. Что я делаю не так? Решить «Не удалось загрузить библиотеку эмуляции OpenGLES: не удалось загрузить DLL!» Для Android Emulator Как устройства Android получают открытые ключи разработчиков? Что происходит на устройстве Android при обновлении приложения? Можно ли получать SMS с Android-эмулятора? Используйте только графические элементы XHDPI в приложении Android? Увеличить OpenGL ES 2.0 – объект исчезает GCM дает нулевое сообщение Монитор Android Studio и Android Невозможно сделать дочерний вид более широким, чем родительский, в макете Android Нужно ли мне несколько раз называть Crashlytics.start?