Android 在安卓改型中手动重试请求的好方法

Android 在安卓改型中手动重试请求的好方法,android,retrofit,Android,Retrofit,我知道改装会在失败时自动重试,但我想检查是否存在特定错误。如果错误是由于某个HTTP代码引起的,我需要在修改请求后重试该请求 使用同步调用很容易做到这一点,但我正在进行异步调用(通过 传递回调)。当我在回调中得到错误时,我想重试该请求-但我所拥有的只是 修改错误对象(我已经丢失了请求正文) 我有来自同一个活动的多个请求(同时进行),因此我避免保存所有请求并在成功时取消它们 有没有更好的方法来达到这一要求?以下是您可以尝试的方法。首先,网络请求方法: void getDataFromServer(

我知道改装会在失败时自动重试,但我想检查是否存在特定错误。如果错误是由于某个HTTP代码引起的,我需要在修改请求后重试该请求

使用同步调用很容易做到这一点,但我正在进行异步调用(通过 传递回调)。当我在回调中得到错误时,我想重试该请求-但我所拥有的只是 修改错误对象(我已经丢失了请求正文)

我有来自同一个活动的多个请求(同时进行),因此我避免保存所有请求并在成功时取消它们


有没有更好的方法来达到这一要求?

以下是您可以尝试的方法。首先,网络请求方法:

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
将根据需要配备
拦截器。这将消除对http
OkHttp
的依赖,尽管我仍然建议使用它。

你有什么收获吗?目前,我不得不大规模地实现这一点,而我的手动重试方法似乎有点臃肿。@JoshPinter
OkHttp
刚刚添加了一个
拦截器,它非常适合于此。看下面。@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;
    }
}