package com.example.client; import android.os.AsyncTask; import com.example.client.request.Request; import com.example.client.response.Response; import org.alfonz.utility.Logcat; import java.lang.ref.WeakReference; public class APICallTask extends AsyncTask<Void, Void, Response<?>> { private static final int RETRY_MAX_ATTEMPTS = 1; // default value for max number of retries private static final long RETRY_INIT_BACKOFF = 500L; // initial sleep time before retry private APICall mAPICall; private WeakReference<APICallListener> mListener; private int mMaxAttempts = RETRY_MAX_ATTEMPTS; public APICallTask(Request request, APICallListener listener) { mAPICall = new APICall(request, this); setListener(listener); } public APICallTask(Request request, APICallListener listener, int maxAttempts) { this(request, listener); setMaxAttempts(maxAttempts); } @Override protected Response<?> doInBackground(Void... params) { // response Response<?> response = null; // sleep time before retry long backoff = RETRY_INIT_BACKOFF; for(int i = 0; i < mMaxAttempts; i++) { // execute API call response = mAPICall.execute(); // success if(response != null) { break; } // fail else { if(i == mMaxAttempts) break; try { Logcat.d("sleeping for %d ms before retry", backoff); Thread.sleep(backoff); } catch(InterruptedException e) { // activity finished before we complete Logcat.d("thread interrupted so abort remaining retries"); Thread.currentThread().interrupt(); break; } // increase backoff exponentially backoff *= 2; } } return response; } @Override protected void onPostExecute(Response<?> response) { if(isCancelled()) return; APICallListener listener = mListener.get(); if(listener != null) { if(response != null) { listener.onAPICallRespond(this, mAPICall.getResponseStatus(), response); } else { listener.onAPICallFail(this, mAPICall.getResponseStatus(), mAPICall.getException()); } } } @Override protected void onCancelled() { Logcat.d(""); } public Request getRequest() { return mAPICall.getRequest(); } public void setListener(APICallListener listener) { mListener = new WeakReference<>(listener); } public void setMaxAttempts(int maxAttempts) { mMaxAttempts = maxAttempts; } public void kill() { mAPICall.kill(); } }