我已经创建了这个抽象类,以便在出现异常时自动重试网络调用。
- 我会注意不在
InterruptedException
和UnknownHostException
之后重试。 - 我会重试5次。每次失败后,我会执行指数级退避,从300ms开始增加到1500ms。
public abstract class AutoRetry {
private Object dataToReturn = null;
public Object getDataToReturn() {
return this.dataToReturn;
}
public AutoRetry() {
short retry = -1;
while (retry++ < StaticData.NETWORK_RETRY) {
try {
Thread.sleep(retry * StaticData.NETWORK_CALL_WAIT);
this.dataToReturn = doWork();
break;
} catch (InterruptedException | UnknownHostException e) {
e.printStackTrace();
this.dataToReturn = null;
return;
} catch (IOException e) {
e.printStackTrace();
}
}
}
protected abstract Object doWork() throws IOException;
}
我使用它的方式如下:
final Object dataAfterWork = new AutoRetry() {
@Override
protected Object doWork() throws IOException {
return; //a network call which returns something
}
}.getDataToReturn();
那么这个实现是否好/正确?
Java 8
的lambda表达式 - 要求一个Supplier<T>
并返回T
。这将极大地减少样板代码。 - Boris the Spidernull
、赋值和break
。此外,我的方法中的泛型比你的Object
更加简洁。 - Boris the Spider