package cgeo.geocaching.utils; import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; import io.reactivex.Single; import io.reactivex.SingleEmitter; import io.reactivex.SingleOnSubscribe; import io.reactivex.disposables.Disposables; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class RxOkHttpUtils { private RxOkHttpUtils() { // Do not instantiate } /** * Create a Single for running a cancellable request. * * @param client the client to use for this request * @param request the request * @return a Single containing the response or an IOException */ public static Single<Response> request(final OkHttpClient client, final Request request) { return Single.create(new SingleOnSubscribe<Response>() { @Override public void subscribe(final SingleEmitter<Response> singleEmitter) throws Exception { final Call call = client.newCall(request); final AtomicBoolean completed = new AtomicBoolean(false); singleEmitter.setDisposable(Disposables.fromRunnable(new Runnable() { @Override public void run() { if (!completed.get()) { call.cancel(); } } })); call.enqueue(new Callback() { @Override public void onFailure(final Call call, final IOException e) { completed.set(true); singleEmitter.onError(e); } @Override public void onResponse(final Call call, final Response response) throws IOException { completed.set(true); singleEmitter.onSuccess(response); } }); } }); } }