当处理RxJava 2 Disposable时,是否有一种干净的方法来取消OkHttp 3请求?

时间:2018-02-02 21:47:17

标签: java android rx-java2 okhttp3

所以我一直试图找到解决这个问题的干净方法。这是REST API类:

public class RestClient {

    private final IJsonParser jsonParser;
    private IServerUtils serverUtils;
    private String baseApiUrl;
    private OkHttpClient okHttpClient;

    @Inject
    public RestClient(OkHttpClient okHttpClient, IJsonParser jsonParser, IServerUtils serverUtils, @Named("baseApiUrl") String baseApiUrl) {
        this.okHttpClient = okHttpClient;
        this.jsonParser = jsonParser;
        this.serverUtils = serverUtils;
        this.baseApiUrl = baseApiUrl;
    }

    public Single<String> get(String route) {
        if (serverUtils.isThereInternetConnection()) {
            Request request = new Request.Builder()
                    .get()
                    .url(baseApiUrl + route)
                    .build();
            final Call call = okHttpClient.newCall(request);
            return Single.create(emitter -> {
                execute(call, emitter);
            });
        } else {
            return Single.error(new NetworkException());
        }
    }

    public Single<String> post(String route, RequestBody requestBody) {
        if (serverUtils.isThereInternetConnection()) {
            Request request = new Request.Builder()
                    .post(requestBody)
                    .url(baseApiUrl + route)
                    .build();
            final Call call = okHttpClient.newCall(request);
            return Single.create(emitter -> execute(call, emitter));
        } else {
            return Single.error(new NetworkException());
        }
    }

    public Single<String> postNoCache(String route, RequestBody requestBody) {
        if (serverUtils.isThereInternetConnection()) {
            Request request = new Request.Builder()
                    .post(requestBody)
                    .url(baseApiUrl + route)
                    .cacheControl(CacheControl.FORCE_NETWORK)
                    .build();
            final Call call = okHttpClient.newCall(request);
            return Single.create(emitter -> execute(call, emitter));
        } else {
            return Single.error(new NetworkException());
        }
    }

    Response postRaw(String route, RequestBody requestBody) throws IOException {
        Request request = new Request.Builder()
                .post(requestBody)
                .url(baseApiUrl + route)
                .build();

        return okHttpClient.newCall(request).execute();
    }

    public RequestBody convertHashMapToRequestBody(HashMap<String, String> params) {
        FormBody.Builder builder = new FormBody.Builder();
        for (String key : params.keySet()) {
            builder.add(key, params.get(key));
        }
        return builder.build();
    }

    private void execute(Call call, SingleEmitter<String> emitter) throws IOException {
        try {
            Response response = call.execute();
            String responseJson = response.body().string();
            if (response.isSuccessful()) {
                emitter.onSuccess(responseJson);
            } else {
                handleErrors(emitter, response, responseJson);
            }
        } catch (InterruptedIOException e) {
         // This is my issue.
        }

    }

    private void handleErrors(SingleEmitter<String> emitter, Response response, String responseJson) {
        if (response.code() == 500 && responseJson != null) {
            ApiError error = jsonParser.parseApiError(responseJson);
            emitter.onError(new ApiException(error.getErrorMsg(), error.getError(), error.getUri()));
        } else {
            emitter.onError(new NetworkException("timeout"));
        }
    }

所以在我的execute()方法中,当我的上游观察者被销毁时,我想以某种方式得到某种回调,所以我可以取消我的网络请求。目前似乎发生的是Single运行的线程获得一个中断,它抛出一个异常,我不知道这是否会停止执行。这样做有干净的方法吗?我唯一能看到的就是emitter.isDisposed(),我无法看到正常的用例,因为这里的一切都是同步的,当我检查这个值时,它很可能已经太晚了。 / p>

对此的任何帮助将不胜感激。

0 个答案:

没有答案