我怎样才能添加重试功能到Retrofit 2库发送的请求中。
service.listItems().enqueue(new Callback<List<Item>>() {
@Override
public void onResponse(Response<List<Item>> response) {
...
}
@Override
public void onFailure(Throwable t) {
...
}
}).retryOnFailure(5 /* times */);
8条答案
按热度按时间wpcxdonn1#
我终于做了这样的事,给大家看:
1
首先我创建了一个抽象类
CallbackWithRetry
使用这个类,我可以做类似这样的事情:
2
这并不完全令人满意,因为我必须传递相同的
serviceCall
两次。这可能会令人困惑,因为人们可能会认为第二个serviceCall
(进入CallbackWithRetry
的构造函数)应该或可能与第一个不同(我们在其上调用enqueue
方法)所以我实现了一个helper类
CallUtils
:我可以这样使用它:
这样,我必须将一个标准的
Callback
传递给enqueueWithRetry
方法,它使我实现onFailure
(尽管在前面的方法中我也可以实现它)这就是我解决这个问题的方法。如果你能给我一个更好的设计建议,我将不胜感激。
iyfjxgzm2#
我已经定制了Callback接口的实现,你可以用它来代替原来的回调。如果调用成功,onResponse()方法被调用。如果在设置的重复次数后重试调用失败,onFailedAfterRetry()方法被调用。
https://gist.github.com/milechainsaw/811c1b583706da60417ed10d35d2808f
cwdobuhd3#
ashkan-sarlak答案工作得很好,我只是想让它保持最新状态。
从retrofit 2.1
更改为
现在就很简单了。像这样创建
CallbackWithRetry.java
就这样!你可以这样简单地使用它
jtw3ybtb4#
使用RxJava Observable并调用retry()文档:https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators
yxyvkwin5#
我做了一些与Ashkan Sarlak非常相似的事情,但是由于Retrofit 2.1将
Call<T>
传递到onFailure
方法中,因此可以简化为一个CallbackWithRetry<T>
抽象类。cld4siwp6#
带改型2.5
现在可以通过java.util.concurrent.completableFuture进行异步同步调用,代码等待它的完成,这非常好。
下面是一个gist,其中包含一个有效的解决方案。
3df52oht7#
如果重试是可选的,则此问题的另一解决方案是:
这样,您就可以选择是否重试:
yi0zb3m48#
我认为对于Android来说,我们不需要为此进行改造。我们可以利用工作管理器(它预定义了Android API)。我们可以使用“ListenableWorker.Result.SUCCESS”,“ListenableWorker.Result.RETRY”等来实现上述目标。