/** * Created by milechainsaw on 7/19/16. * * Exponential backoff callback for Retrofit2 * */ public abstract class BackoffCallback implements Callback { 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 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 call) { call.clone().enqueue(this); } public abstract void onFailedAfterRetry(Throwable t); }