발리 타임 아웃 시간 변경


191

Android에 새로운 Volley 프레임 워크를 사용하여 서버에 요청합니다. 그러나 응답하지만 응답을 받기 전에 시간이 초과됩니다.

이 코드를 추가하려고했습니다.

HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);

에서 HttpClientStack다른 정수 (50000)에 발리 프레임 워크,하지만 여전히 시간이 초과 50초 전에.

시간 초과를 긴 값으로 변경하는 방법이 있습니까?



21
@AdamStelmaszczyk-Volley 프레임 워크의 특정 세부 사항에 대해서는 중복되지 않습니다. HttpClient클래스 사용에 대한 참조 SO 질문 .
Michael Banzon 2018 년

답변:


359

참조 Request.setRetryPolicy()및 생성자에 대한 DefaultRetryPolicy

JsonObjectRequest myRequest = new JsonObjectRequest(Method.GET,
        url, null,
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG, "Error: " + error.getMessage());
            }
});

myRequest.setRetryPolicy(new DefaultRetryPolicy(
        MY_SOCKET_TIMEOUT_MS, 
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

요청의 우선 순위를 설정하는 방법도 알고 있습니까?
Markus

2
@Markus는 Request.getPriority ()를 재정 의하여 'normal'이외의 것을 반환합니다. ImageRequest가이를 수행합니다. 참고 : 당신은 별도의 SO 질문으로 이것을 요구해야합니다.
larham1

1
이것은 정확히 Volley가 15 초가 걸리는 요청을 버리지 못하게하기 위해 찾고 있던 것입니다. -고맙습니다!
slott

시간 초과시 재 시도를 비활성화하기 위해 POST 요청에 대해 이것을 추가했습니다. Google 개발자가 POST 요청에 대해 재시도 정책을 설정하기로 결정한 것은 놀라운 일입니다. 내 문제를 해결했습니다. 감사.
Proverbio

1
@ Roon13은 방금 추가 된 샘플 요청 생성자를 봅니다.
larham1

226

안드로이드 발리 타임 아웃을 처리하려면 RetryPolicy

재시도 정책

  • 발리는 요청에 대해 RetryPolicy를 쉽게 구현할 수있는 방법을 제공합니다.
  • 발리는 모든 요청에 ​​대해 기본 Socket & ConnectionTImeout을 5 초로 설정합니다.

RetryPolicy 시간 초과가 발생했을 때 특정 요청을 다시 시도하는 방법에 대한 논리를 구현해야하는 인터페이스입니다.

이 세 가지 매개 변수를 처리합니다

  • 제한 시간-재 시도 할 때마다 소켓 제한 시간을 밀리 초 단위로 지정합니다.
  • 재시도 횟수-재시도 횟수입니다.
  • Back Off Multiplier 백 오프 승수-모든 재 시도에 대해 소켓에 설정된 지수 시간을 결정하는 데 사용되는 승수입니다.

예를 들어. 이 값으로 RetryPolicy를 생성 한 경우

시간 초과-3000ms, 재시도 횟수-2, 백 오프 승수-2.0

재시도 1

  • 시간 = 시간 + (시간 * 백 오프 승수);
  • 시간 = 3000 + 6000 = 9000ms
  • 소켓 타임 아웃 = 시간;
  • 소켓 시간 초과가 9 초인 요청

재시도 2 :

  • 시간 = 시간 + (시간 * 백 오프 승수);
  • 시간 = 9000 + 18000 = 27000ms
  • 소켓 타임 아웃 = 시간;
  • 27 초의 소켓 제한 시간 초과로 요청이 전달됨

따라서 재시도 2 가 끝날 때 소켓 시간 초과가 발생하면 Volley는 TimeoutErrorUI 오류 응답 핸들러에를 던질 것 입니다.

//Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions. 
//Volley does retry for you if you have specified the policy.
jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(5000, 
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

RetryPolicy구현이 실제로 하는 일에 대한 자세한 답변을 주셔서 감사합니다 .
dbm

5
좋은 답변 @Yakiv Mospan. 그러나 귀하의 예에서 첫 번째 시도 시간은 3000 + (3000 * 2) 대신 0 + (3000 * 2)입니다. 그리고 두 번째는 6000 + (3000 * 2)입니다.
13KZ

13KZ, 시간 계산과 관련하여 여전히 틀렸다고 생각합니다. 편집 내용을 확인하고 발리 소스를 확인하십시오
Protongun

1
이 사용하는 사람들에게 그냥 알림 항상 사용 new DefaultRetryPolicy(하고 있는지 확인 재사용 결코RetryPolicy 따라서 미래의 요청 제한 시간이 무한히 성장하고, 객체가 모든 요청 프로세스를 통해 참조로, 개체를 다시 시도 단위가 동일한 개체 시간 제한 값을 통해 추가
IG Pascual

연결 핸드 셰이크 시간 초과는 어떻습니까?
GMsoF

23

내 접근 방식에 기여하기 위해. 이미 대답했듯이 RetryPolicy갈 길입니다. 그러나 모든 요청에 ​​대해 기본값과 다른 정책이 필요한 경우 기본 요청 클래스에서 정책을 설정할 수 있으므로 모든 요청 인스턴스에 대해 정책을 설정할 필요가 없습니다.

이 같은:

public class BaseRequest<T> extends Request<T> {

    public BaseRequest(int method, String url, Response.ErrorListener listener) {
        super(method, url, listener);
        setRetryPolicy(getMyOwnDefaultRetryPolicy());
    }
}

제 경우에는이 BaseRequest에서 확장되는 GsonRequest가 있으므로 특정 요청에 대한 정책을 설정하는 것을 잊어 버릴 위험이 없으며 특정 요청이 필요한 경우 여전히 재정의 할 수 있습니다.


1
이것은 제대로 작동합니까? setRetryPolicy (새 DefaultRetryPolicy (1000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
LOG_TAG

12
/**
 * @param request
 * @param <T>
 */
public <T> void addToRequestQueue(Request<T> request) {

    request.setRetryPolicy(new DefaultRetryPolicy(
            MY_SOCKET_TIMEOUT_MS,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    getRequestQueue().add(request);
}

7
req.setRetryPolicy(new DefaultRetryPolicy(
    MY_SOCKET_TIMEOUT_MS, 
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

MY_SOCKET_TIMEOUT_MS100으로 설정할 수 있습니다.이 설정 을 원하는 것은 밀리 초입니다. DEFAULT_MAX_RETRIES0이 될 수 있습니다. 기본값은 1입니다.


4
int MY_SOCKET_TIMEOUT_MS=500;

 stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                MY_SOCKET_TIMEOUT_MS,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

3

이를 수행하는 다른 방법은 다음과 같이 사용자 정의 JsonObjectRequest에 있습니다.

@Override
public RetryPolicy getRetryPolicy() {
    // here you can write a custom retry policy and return it
    return super.getRetryPolicy();
}

출처 : Android Volley Example


2

위의 모든 솔루션이 효과가없는 경우 대체 솔루션

기본적으로 Volley 는 값을 from setConnectionTimeout()setReadTimeout()함께 똑같이 시간 초과를 설정 RetryPolicy합니다. 필자의 경우 Volley큰 데이터 청크에 대한 시간 초과 예외가 발생합니다.

com.android.volley.toolbox.HurlStack.openConnection(). 

내 솔루션은 HttpStacksetReadTimeout()정책으로 확장되는 클래스를 만드는 것 입니다. 그런 다음 다음 RequestQueue과 같이 만들 때 사용하십시오 .

Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())

1

에 메소드 setCurrentTimeout(int timeout)를 추가하고에 RetryPolicy구현했습니다 DefaultRetryPolicy.

그런 다음 setCurrentTimeout(int timeout)Request 클래스에를 추가 하고 호출했습니다.

이것은 일을하는 것처럼 보입니다.

그건 그렇고 게으름에 죄송하고 오픈 소스에 대한 만세.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.