首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Retrofit 2重试请求

使用Retrofit 2重试请求
EN

Stack Overflow用户
提问于 2015-09-15 15:05:46
回答 5查看 29.3K关注 0票数 30

如何为Retrofit 2库发送的请求添加重试功能?类似于:

代码语言:javascript
复制
service.listItems().enqueue(new Callback<List<Item>>() {
        @Override
        public void onResponse(Response<List<Item>> response) {
            ...
        }

        @Override
        public void onFailure(Throwable t) {
            ...
        }
    }).retryOnFailure(5 /* times */);
EN

回答 5

Stack Overflow用户

发布于 2016-07-19 20:58:26

我已经定制了回调接口的实现,你可以用它来代替原来的回调。如果调用成功,则调用onResponse()方法。如果在重试设置的重复次数后调用失败,则调用onFailedAfterRetry()。

代码语言:javascript
复制
public abstract class BackoffCallback<T> implements Callback<T> {
private static final int RETRY_COUNT = 3;
/**
 * Base retry delay for exponential backoff, in Milliseconds
 */
private static final double RETRY_DELAY = 300;
private int retryCount = 0;

@Override
public void onFailure(final Call<T> call, Throwable t) {
    retryCount++;
    if (retryCount <= RETRY_COUNT) {
        int expDelay = (int) (RETRY_DELAY * Math.pow(2, Math.max(0, retryCount - 1)));
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                retry(call);
            }
        }, expDelay);
    } else {
        onFailedAfterRetry(t);
    }
}

private void retry(Call<T> call) {
    call.clone().enqueue(this);
}

public abstract void onFailedAfterRetry(Throwable t);

}

https://gist.github.com/milechainsaw/811c1b583706da60417ed10d35d2808f

票数 14
EN

Stack Overflow用户

发布于 2018-10-10 17:16:43

ashkan-sarlak answer工作得很好,我只是想让它跟上时代。

来自retrofit 2.1

代码语言:javascript
复制
onFailure(Throwable t) 

更改为

代码语言:javascript
复制
onFailure(Call<T> call, Throwable t)

因此,这使得创建CallbackWithRetry.java变得非常容易,如下所示

代码语言:javascript
复制
public abstract class CallbackWithRetry<T> implements Callback<T> {

    private static final int TOTAL_RETRIES = 3;
    private static final String TAG = CallbackWithRetry.class.getSimpleName();
    private int retryCount = 0;

    @Override
    public void onFailure(Call<T> call, Throwable t) {
        Log.e(TAG, t.getLocalizedMessage());
        if (retryCount++ < TOTAL_RETRIES) {
            Log.v(TAG, "Retrying... (" + retryCount + " out of " + TOTAL_RETRIES + ")");
            retry(call);
        }
    }

    private void retry(Call<T> call) {
        call.clone().enqueue(this);
    }
}

就这样!您可以像这样简单地使用它

代码语言:javascript
复制
call.enqueue(new CallbackWithRetry<someResponseClass>() {

        @Override
        public void onResponse(@NonNull Call<someResponseClass> call, @NonNull retrofit2.Response<someResponseClass> response) {
            //do what you want
        }
        @Override
        public void onFailure(@NonNull Call<someResponseClass> call, @NonNull Throwable t) {
            super.onFailure(call,t);
            //do some thing to show ui you trying
            //or don't show! its optional
        }
    });
票数 4
EN

Stack Overflow用户

发布于 2015-09-15 18:29:50

使用RxJava Observable并调用retry()文档:https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32579754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档