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는 TimeoutError
UI 오류 응답 핸들러에를 던질 것 입니다.
//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_MS
100으로 설정할 수 있습니다.이 설정 을 원하는 것은 밀리 초입니다. DEFAULT_MAX_RETRIES
0이 될 수 있습니다. 기본값은 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();
}