2016년 12월 26일

안드로이드에서 Volley 을 사용하여 HTTP 통신을 할때 타임아웃 문제

Volley 의 주요 기능중 하나는 비동기 방식의 RESTful HTTP 요청을 간단하게 구현할 수 있다는 점이다.

Transmitting Network Data Using Volley

다음의 코드를 보자. 일반적인 경우는 (2.5초 이내에 응답이 오는 경우) 문제가 없지만 서버와 통신이 지연되는 경우 안드로이드 앱이 다시 한번 서버 요청을 하게되는 것을 확인하게 될것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
    private void memberJoin() {
        String url = "http://test.com/data/member/join.jsp";
        StringRequest stringRequest = new StringRequest(
            Request.Method.POST, 
            url, 
            createMySuccessListener(), 
            createMyErrorListener()) {
            protected Map<StringString> getParams() throws com.android.volley.AuthFailureError {
                Map<StringString> params = new HashMap<StringString>();
                eturn params;
            }
        };
        queue.add(stringRequest);
    }
    public Response.Listener<String> createMySuccessListener() {
        return new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {         
       
            }
        };
    }
    public Response.ErrorListener createMyErrorListener() {
        return new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                
            }
        };
    }
cs

이는 기본적으로 Volley 에서 서버에 요청을 보낼때는 기본정책이 적용되고 있는데 이때 응답 대기 타임아웃 값이  2500 마이크로초로 설정되어 있기 때문이다. 다음은 관련 Volley 자바 클래스이다.

  • com.android.volley.toolbox.StringRequest
  • com.android.volley.Request
  • com.android.volley.DefaultRetryPolicy 


2.5 초 이상의 응답 대기가 요구되는 경우는 아래와 같이 커스텀 정책을 생성하여 설정하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
    private void memberJoin() {
        String url = "http://test.com/data/member/join.jsp";
        StringRequest stringRequest = new StringRequest(
            Request.Method.POST, 
            url, 
            createMySuccessListener(), 
            createMyErrorListener()) {
            protected Map<StringString> getParams() throws com.android.volley.AuthFailureError {
                Map<StringString> params = new HashMap<StringString>();
                eturn params;
            }
        };
        // 커스텀 정책을 생성하여 지정한다.
        stringRequest.setRetryPolicy(new com.android.volley.DefaultRetryPolicy(
            20000 ,
            com.android.volley.DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            com.android.volley.DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        queue.add(stringRequest);
    }
cs

댓글 3개:

  1. 덕분에 3주동안 해결하지 못했던 문제를 해결했습니다. 감사합니다!

    답글삭제
  2. 감사합니다. 원하던 해결책을 드디어 찾았네요.

    답글삭제