您可以尝试以下方法。首先是网络请求方式:
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
...
}
}
});
}
在这里您可以检查是否应该重试请求,如果我们应该重试则返回 true,如果不应该重试则返回 false。
重试的前半部分检查错误的状态代码(参见r.getStatus())是否等于您感兴趣的状态代码(参见STATUS_CODE_RETRY),它可以是任何服务器状态代码(例如401、404) . 等等)。
重试的后半部分首先检查它是否是网络错误(参见error.isNetworkError()),如果是,则增加重试计数器并返回true,这意味着将重试网络请求。如果错误是网络错误(请参阅error.isNetworkError())并且重试计数器大于您希望的最大重试次数(请参阅NUM_RETRIES),则它返回false,因此请求不会再次被触发。下一部分是无连接检查,其中发生了网络错误但不是超时,因此它一定是连接问题。此检查返回 false,因为不应重试网络请求并且应通知用户连接问题。最后的检查是非网络错误检查,它表示发生的错误不是网络错误的结果。再次返回 false,因此不会重试请求并通知用户。
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;
}
}
希望这会有所帮助。