카테고리 보관물: Android

Android

발리 타임 아웃 시간 변경 서버에 요청합니다. 그러나 응답하지만

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

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

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

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

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



답변

참조 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));


답변

안드로이드 발리 타임 아웃을 처리하려면 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갈 길입니다. 그러나 모든 요청에 ​​대해 기본값과 다른 정책이 필요한 경우 기본 요청 클래스에서 정책을 설정할 수 있으므로 모든 요청 인스턴스에 대해 정책을 설정할 필요가 없습니다.

이 같은:

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

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

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


답변

/**
 * @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);
}


답변

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

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


답변

int MY_SOCKET_TIMEOUT_MS=500;

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


답변

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

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

출처 : Android Volley Example