Отправка простого запроса

Видео

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

На высоком уровне, вы используете Volley создавая RequestQueue и передавая ему Request объекты. RequestQueue управляет рабочими потоками, выполняющими сетевые операций, чтение и запись кэша, а так же анализ ответов. Объект Request выполняет разбор сырых ответов и Volley занимается диспетчеризацией проанализированного ответа обратно в основной поток.

Этот урок описывает, как отправить запрос с помощью Volley.newRequestQueue метода, который устанавливает RequestQueue для вас. См. следующий урок, Настройка RequestQueue, для получения информации о том, как настроить RequestQueue самому.

Этот урок также описывается, как добавить запрос в RequestQueue и как этот запрос отменить.

Добавление разрешения INTERNET

Для использования Volley, необходимо добавить android.permission.INTERNET разрешение в манифест вашего приложения. Без этого, ваше приложение не будет иметь возможность подключиться к сети.

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

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

final TextView mTextView = (TextView) findViewById(R.id.text);
...

// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";

// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener
       
        () {
    @Override
    public void onResponse(String response) {
        // Display the first 500 characters of the response string.
        mTextView.setText("Response is: "+ response.substring(0,500));
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        mTextView.setText("That didn't work!");
    }
});
// Add the request to the RequestQueue.
queue.add(stringRequest);

       

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

Смотрите Настройка RequestQueue , где описано, как настроить RequestQueue самому, вместо того чтобы использовать Volley.newRequestQueue метод.

Отправить запрос

Чтобы отправить запрос, вы просто должны его создать и добавить его в RequestQueue с помощью метода add(), как показано выше. После добавления запроса он перемещается по конвейеру, обслуживается, и его неразобранный ответ анализируется и доставляется.

Когда вы вызываете add(), Volley запускается один поток обработки кэша и пул потоков сетевой диспетчеризации. При добавлении запросов в очередь, их подбирает поток кэша и рассортировывает: если ответ на запрос может быть взят из кэша, кэшированный ответ анализируется в потоке кэша, а разобранный ответ отправляется в основной поток. Если ответ на запрос не может быть получен из кэша, он будет помещен в сетевую очередь. Первый доступный сетевой поток вынимает запрос из очереди, выполняет HTTP транзакцию, выполняет разбор ответа в рабочем потоке, сохраняет ответ в кэш, и отправляет проанализированный ответ обратно в основной поток для окончательной обработки.

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

На рисунке 1 показана жизнь запроса:

 система бары

Рисунок 1. Жизнь запроса.

Отменить запрос

Для отмены запроса, вызовите cancel() для вашего Request объекта. После того, как вы отменили запрос, Volley гарантирует, что ваш обработчик ответа никогда не будет вызван. На практике это означает, что вы можете отменить все ваши ожидающие запросы в вашей деятельности в методе onStop() и вы не должны засорять обработчики ответов проверками getActivity() == null, был ли onSaveInstanceState() уже вызван, или другими защитными шаблонами.

Чтобы воспользоваться этим поведением, вы, как правило, должны отслеживать все обрабатываемые запросы для того, чтобы иметь возможность отменить их в соответствующее время. Существует более простой способ: вы можете связать тег с каждым из запросов. Вы можете использовать этот тег, чтобы отменить ряд запросов. Например, вы можете пометить все ваши запросы с помощью Activity , посланные из неё, вызвав requestQueue.cancelAll(this) из onStop(). Точно так же, вы могли бы пометить все запросы с миниатюрами изображений в ViewPager вкладке, используя соответствующую вкладку, и отменить запросы при переключении, чтобы убедиться, что новая вкладка не задерживается запросами другой.

Следующий пример использует строковое значение для тега:

  1. Определите свой тег и добавьте его к вашим запросам.
    public static final String TAG = "MyTag";
    StringRequest stringRequest; // Assume this exists.
    RequestQueue mRequestQueue;  // Assume this exists.
    
    // Set the tag on the request.
    stringRequest.setTag(TAG);
    
    // Add the request to the RequestQueue.
    mRequestQueue.add(stringRequest);
  2. В вашей деятельности в onStop() методе, отменить все запросы, которые имеют этот тег.
    @Override
    protected void onStop () {
        super.onStop();
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(TAG);
        }
    }
    

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