간단한 요청 보내기

고급 단계에서는 RequestQueue를 만들고 Request 개체를 전달하여 Volley를 사용합니다. RequestQueue에서는 네트워크 작업을 실행하고 캐시를 읽고 쓰고 응답을 파싱하기 위해 작업자 스레드를 관리합니다. 요청에서 원시 응답을 파싱하고 Volley에서 파싱된 응답을 전달을 위해 기본 스레드에 돌려보냅니다.

이 과정에서는 RequestQueue를 설정해주는 Volley.newRequestQueue 편의 메서드를 사용하여 요청을 보내는 방법을 설명합니다. RequestQueue를 직접 설정하는 방법은 다음 과정 RequestQueue 설정을 참조하세요.

이 과정에서는 RequestQueue에 요청을 추가하고 요청을 취소하는 방법도 설명합니다.

인터넷 권한 추가

Volley를 사용하려면 앱의 manifest에 android.permission.INTERNET 권한을 추가해야 합니다. 이 권한이 없으면 앱이 네트워크에 연결할 수 없습니다.

newRequestQueue 사용

Volley에서는 기본값을 사용하여 RequestQueue를 설정해주는 편의 메서드 Volley.newRequestQueue를 제공하고 대기열을 시작합니다. 예:

Kotlin

    val textView = findViewById<TextView>(R.id.text)
    // ...

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

    // Request a string response from the provided URL.
    val stringRequest = StringRequest(Request.Method.GET, url,
            Response.Listener<String> { response ->
                // Display the first 500 characters of the response string.
                textView.text = "Response is: ${response.substring(0, 500)}"
            },
            Response.ErrorListener { textView.text = "That didn't work!" })

    // Add the request to the RequestQueue.
    queue.add(stringRequest)
    

자바

    final TextView textView = (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<String>() {
        @Override
        public void onResponse(String response) {
            // Display the first 500 characters of the response string.
            textView.setText("Response is: "+ response.substring(0,500));
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            textView.setText("That didn't work!");
        }
    });

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

Volley에서는 항상 기본 스레드에서 파싱된 응답을 전달합니다. 기본 스레드에서 실행하면 응답 핸들러에서 직접 UI 컨트롤을 자유롭게 수정할 수 있으므로 수신된 데이터로 UI 컨트롤을 채우는 데 편리하지만 라이브러리에서 제공한, 특히 요청 취소와 관련된 대부분의 의미 체계에 특히 중요합니다.

Volley.newRequestQueue 편의 메서드를 사용하는 대신 RequestQueue를 직접 설정하는 방법에 관한 정보는 RequestQueue 설정을 참조하세요.

요청 보내기

요청을 보내려면 요청을 구성하고 위에 표시된 대로 add()를 사용하여 RequestQueue에 추가하면 됩니다. 요청을 추가하면 요청이 파이프라인을 통해 이동하고 처리되며 원시 응답이 파싱되어 전달됩니다.

add()를 호출하면 Volley에서 캐시 처리 스레드 하나와 네트워크 전달 스레드의 풀을 실행합니다. 대기열에 요청을 추가하면 요청이 캐시 스레드에 의해 선택되고 분류됩니다. 캐시에서 요청을 처리할 수 있는 경우 캐싱된 응답이 캐시 스레드에서 파싱되고 파싱된 응답이 기본 스레드에서 전달됩니다. 캐시에서 요청을 처리할 수 없는 경우에는 요청이 네트워크 대기열에 추가됩니다. 사용 가능한 첫 번째 네트워크 스레드가 대기열에서 요청을 가져오고 HTTP 트랜잭션을 실행하고 작업자 스레드에서 응답을 파싱하고 응답을 캐시에 쓴 다음 파싱된 응답을 전달을 위해 기본 스레드에 다시 게시합니다.

I/O 차단 및 파싱/디코딩과 같이 많은 비용이 드는 작업은 작업자 스레드에서 실행됩니다. 어느 스레드에서나 요청을 추가할 수 있지만 응답은 항상 기본 스레드에서 전달됩니다.

그림 1에서는 요청의 처리 과정을 보여줍니다.

시스템 표시줄

그림 1. 요청의 처리 과정

요청 취소

요청을 취소하려면 Request에서 cancel()을 호출하세요. 요청이 취소되면 Volley에서 요청 핸들러가 호출되지 않도록 보장합니다. 즉 활동의 onStop()에서 대기 중인 모든 요청을 취소할 수 있으며 onSaveInstanceState() 또는 다른 방어 상용구가 호출되었는지 관계없이 getActivity() == null이 있는지 확인하기 위해 응답 핸들러를 혼란스럽게 할 필요가 없습니다.

이 동작을 이용하려면 일반적으로 진행 중인 모든 요청을 추적하여 적절한 시간에 취소할 수 있도록 해야 합니다. 각 요청에 태그 개체를 연결하면 더 쉽게 추적할 수 있습니다. 그런 다음 이 태그를 사용하여 취소할 응답의 범위를 제공할 수 있습니다. 예를 들어 요청이 대신 작성된 Activity로 모든 요청을 태그하고 onStop()에서 requestQueue.cancelAll(this)를 호출할 수 있습니다. 마찬가지로 ViewPager 탭의 모든 미리보기 이미지 요청을 개별 탭으로 태그하고 스와이프 시 취소하여 새 탭이 다른 탭의 요청에 의해 지연되지 않도록 할 수 있습니다.

다음은 태그에 문자열 값을 사용하는 예입니다.

  1. 태그를 정의하여 요청에 추가합니다.

    Kotlin

        val TAG = "MyTag"
        val stringRequest: StringRequest // Assume this exists.
        val requestQueue: RequestQueue? // Assume this exists.
    
        // Set the tag on the request.
        stringRequest.tag = TAG
    
        // Add the request to the RequestQueue.
        requestQueue?.add(stringRequest)
        

    자바

        public static final String TAG = "MyTag";
        StringRequest stringRequest; // Assume this exists.
        RequestQueue requestQueue;  // Assume this exists.
    
        // Set the tag on the request.
        stringRequest.setTag(TAG);
    
        // Add the request to the RequestQueue.
        requestQueue.add(stringRequest);
        
  2. 활동의 onStop() 메서드에서 이 태그가 포함된 모든 요청을 취소합니다.

    Kotlin

        protected fun onStop() {
            super.onStop()
            requestQueue?.cancelAll(TAG)
        }
        

    자바

        @Override
        protected void onStop () {
            super.onStop();
            if (requestQueue != null) {
                requestQueue.cancelAll(TAG);
            }
        }
        

    요청을 취소할 때는 주의하세요. 응답 핸들러에 의존하여 상태를 진행하거나 다른 프로세스를 시작하는 경우 요청 취소를 고려해야 합니다. 다시 한 번 말하지만 응답 핸들러는 호출되지 않습니다.