public static Observable CallToObservable(Call originalCall) { return Observable.create(subscriber -> { Call call = originalCall.clone(); CallArbiter arbiter = new CallArbiter<>(call, subscriber); subscriber.add(arbiter); subscriber.setProducer(arbiter); Response response; try { response = call.execute(); if (!response.isSuccessful()) { throw new HttpException(response); } T body = response.body(); if (body != null) { if (!body.isSuccess()) { throw new ApiException(body.code, body.message); } arbiter.emitResponse(body); } else { throw new Exception("NullResponse"); } } catch (Exception e) { Exceptions.throwIfFatal(e); arbiter.emitError(e); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); }