HttpClient.getInstance()
    .url(url)
    .tag(tag) //Activity, Fragment, Presenter 中最好都加上 tag(this)
    .addParam(key, value)
    .addParam(key, value)
    .addParam(key, value)
    .addUrlParam(key, value) //用于 post 时还想把参数拼在 url 上
    .addHeader(key, value)
    .addHeader(key, value)

    .jsonBody(String json) // MediaType : application/json

    .cacheControl(cacheControl) //缓存
    .addContent(String name, String filename, Bitmap/byte[]/File content) //post 上传文件
    .callbackOn(Schedulers.mainThread()) // optional
    .get(new HttpCallback<T1, T2>() { //T1, T2 支持 Bean, String, JSONObject
        @Override
        protected void onSuccess(int code, T1 data) {

        }

        @Override
        protected void onFailure(int code, T2 data) {

        }

        @Override
        protected void onError(Exception e) {

        }

        @Override
        protected void onFinal() {
    
        }
    }); //get() or post() return httpRequest

HttpClient.getInstance().init(httpClientConfig);  

务必调用 cancel(),建议在 BaseActivity, BaseFragment, BasePresenter onDestroy 中调用 cancel(this)

HttpClient.getInstance().cancel(tag); //tag or httpRequest, httpRequest's default tag is self

post 请求,如果有 addContent, MediaType 会使用 multipart/form-data;如果有 jsonBody, MediaType 会使用 application/json;否则 MediaType 会使用 application/x-www-form-urlencoded

HttpClient.getInstance().init(context);
HttpClient.getInstance().init(context, okHttpClient); //optional
//optional util
Schedulers.mainThread().schedule(new SchedulerTask(request, new Runnable() {
    @Override
    public void run() {
        HttpCallback.super.dispatchOnSuccess(code, data);
    }
}));

如果有用 Schedulers.xxx.schedule(...) 也应该配套调用 Schedulers.cancel(tag)

可以直接用 HttpClient,不过还是建议再进行一层简单的继承封装,可以参考 Demo(XHttpClient, XHttpCallback)

CacheControl

CacheControl缓存以 url 为 key(key 不包含任何参数,就是 .url(url) 传进来的 url,同一个 url 不同参数,会互相覆盖)

new CacheControl.Builder()
    .readCacheWhen(...) //默认值 ReadCacheWhen.AT_ONCE 表示立即读取缓存;ReadCacheWhen.ON_ERROR 表示请求失败才读取缓存
    .maxAge(int seconds) //缓存有效时间,默认值 Integer.MAX_VALUE
    .noCache() //表示不读取缓存
    .noStore() //表示不保存缓存

    .noDiskStore() //表示不允许磁盘缓存(就是只有内存缓存)

    .requestComparator(RequestComparator comparator) //判断是否命中缓存,可以自定义,默认是判断 params headers 的所有 key value

    .responseComparator(ResponseComparator comparator) //判断是否跟最后的缓存一样,一样的话则不回调 onSuccess,可以自定义,默认为空,不进行 headers 比对

    .build()

命中缓存会触发 onCache 回调,不影响继续网络请求,请求成功后,如果与最后一次 cache 结果一样,则不回调 onSuccess,如果不一样会继续回调 onSuccess