Android 在安卓改型中手动重试请求的好方法
我知道改装会在失败时自动重试,但我想检查是否存在特定错误。如果错误是由于某个HTTP代码引起的,我需要在修改请求后重试该请求 使用同步调用很容易做到这一点,但我正在进行异步调用(通过 传递回调)。当我在回调中得到错误时,我想重试该请求-但我所拥有的只是 修改错误对象(我已经丢失了请求正文) 我有来自同一个活动的多个请求(同时进行),因此我避免保存所有请求并在成功时取消它们Android 在安卓改型中手动重试请求的好方法,android,retrofit,Android,Retrofit,我知道改装会在失败时自动重试,但我想检查是否存在特定错误。如果错误是由于某个HTTP代码引起的,我需要在修改请求后重试该请求 使用同步调用很容易做到这一点,但我正在进行异步调用(通过 传递回调)。当我在回调中得到错误时,我想重试该请求-但我所拥有的只是 修改错误对象(我已经丢失了请求正文) 我有来自同一个活动的多个请求(同时进行),因此我避免保存所有请求并在成功时取消它们 有没有更好的方法来达到这一要求?以下是您可以尝试的方法。首先,网络请求方法: void getDataFromServer(
有没有更好的方法来达到这一要求?以下是您可以尝试的方法。首先,网络请求方法:
void getDataFromServer(final int dataId) {
...
dataService.getDataFromServer(dataId, new Callback<ResultData>() {
@Override
public void success(final ResultData data, final Response response) {
retries.set(0);
...
}
@Override
public void failure(RetrofitError error) {
if (RetrofitErrorHandler.retry(activity, progressDialog, error, retries, activity.getString(R.string.error_getting_data))) {
getDataFromServer(dataId);// retry this method
} else {
// let user know we counldn't get data
...
}
}
});
}
希望这有所帮助。如果您正在使用作为您的HttpClient
并已更新为改装=1.9.0
,则可以使用新的。具体来说,an将允许您重试并拨打多个电话
你可以看到我在一个类似的问题上发布了关于处理过期代币的帖子
另请注意,改装2.0
将根据需要配备拦截器。这将消除对httpOkHttp
的依赖,尽管我仍然建议使用它。你有什么收获吗?目前,我不得不大规模地实现这一点,而我的手动重试方法似乎有点臃肿。@JoshPinterOkHttp
刚刚添加了一个拦截器,它非常适合于此。看下面。@mattblang干杯,我来看看!回答得好,但是你能用英语总结一下重试
到底在做什么吗?重试
应该命名为应该重试
或类似名称-它根据已经重试的次数和当前API调用的错误类型检查是否应该重试请求。回答得好,有意义,但是关于getDataFromServer
方法中的retries
变量非常混乱,它来自哪里?
public static boolean retry(Activity act, RetrofitError error, AtomicInteger retries, String uploadErrorMsg){
// this is the first half of the retry check
Response r = error.getResponse();
if (r != null && r.getStatus() == STATUS_CODE_RETRY){
Log.v(TAG, "STATUS_CODE_RETRY!");
...
return true;
}
// this is the second half of the retry check
if (error.isNetworkError()) {
if (error.getCause() instanceof SocketTimeoutException) {//connection timeout check
if(retries.incrementAndGet() < NUM_RETRIES){ // retry if you can
return true;
} else { // if you can't retry anymore
retries.set(0);
Log.i(TAG, act.getClass().getSimpleName() + " has no more retries " + act.getString(R.string.timeout_msg));
return false;
}
} else {//no connection check
retries.set(0);
Log.i(TAG, act.getClass().getSimpleName() + " " + act.getString(R.string.timeout_msg)+ " " + uploadErrorMsg);
return false;
}
} else { //non network error check
retries.set(0);
Log.i(TAG, act.getClass().getSimpleName() + " " + act.getString(R.string.err_msg)+ " " + uploadErrorMsg);
return false;
}
}