• Android如何使用NoHttp


    NoHttp 源码及Demo托管在Github欢迎大家Star: https://github.com/yanzhenjie/NoHttp

    NoHttp是专门做Android网络请求与下载的框架。


    NoHttp 是专门做Android网络请求与下载的框架。

    支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载;支持304缓存,302/303重定向,支持代理服务器。

    NoHttp特性:

    • 支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载,上传下载均有进度。

    • 支持304缓存,自定义缓存,302/303重定向,支持代理服务器访问地址(如: Google)。

    • NoHttp是队列,自动为请求排队,可以取消指定请求, 可以取消队列所有请求,亦可以停止队列。

    • 支持请求String、Bitmap、Json、JavaBean,可自定义扩展请求类型。

    • Request对象包涵参数、文件、请求头等;Response对象包涵响应内容,响应头等信息,Cookie。

    使用Gradle构建时添加依赖:

    第一种, 使用jar包

    NoHttp是一个纯Java代码的框架,没有资源文件,因此可以使用jar包来开发,jar包可以在上面源码的连接中下载到。

    第二种, 使用Gradle添加依赖

    1
    2
    3
    4
    // 引用最新版
    compile 'com.yolanda.nohttp:nohttp:+'
    // 或则引用指定版本
    compile 'com.yolanda.nohttp:nohttp:1.0.0'

    第三种

    使用源码作为module,源码可以在文章开头和结尾的连接中下载到。


    NoHttp 源码及Demo托管在Github欢迎大家Star: https://github.com/yanzhenjie/NoHttp


    一. 请求

    1.请求String数据

     
    // 请求对象
    Request<String> request = NoHttp.createStringRequest(url, requestMethod);
    //添加请求头
    request.addHeader("AppVersioin", "2.0");
    // 添加请求参数
    request.add("userName", "yolanda");
    //上传文件
    request.add("file", new FileBinary(file));

    2.请求Json数据

    // JsonObject
    Request<JSONObject> request = NoHttp.createJsonObjectRequest(url, reqeustMethod);
    queue.add(what, request, responseListener);
    …
    // JsonArray
    Request<JSONArray> request = NoHttp.createJsonArrayRequest(url, reqeustMethod);
    queue.add(what, request, responseListener);

    3. 请求Bitmap数据

    Request<Bitmap> request = NoHttp.createImageRequest(url, requestMethod);
    ...
    4. 取消请求

    取消单个请求

    Request<String> request = NoHttp.createStringRequest(url);
    ...
    request.cancel();

    从队列中取消指定的请求

    Request<String> request = NoHttp.createStringRequest(url);
    request.setCancelSign(sign);
    queue.cancelBySign(sign);

    取消队列中所有请求

    queue.cancelAll();

    停止队列

    RequestQueue queue = NoHttp.newRequestQueue();
    ...
    queue.stop();

    5. 同步请求

    // 在当前线程发起请求,在线程这么使用
    Request<String> request = NoHttp.createStringRequest(url);
    Response<String> response = NoHttp.startRequestSync(request);
    if (response.isSucceed()) {
        // 请求成功
    else {
        // 请求失败
    }

    二. 缓存

    1. Http标准协议的缓存,比如响应码是304时

    现在很多公司使用了RESTFUL风格来写Http API,所以这个是必须有的。

    Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
    // NoHttp本身是RESTFUL风格的标准Http协议,所以这里不用设置或者设置为DEFAULT
    request.setCacheMode(CacheMode.DEFAULT);
    ...
    2. 当请求服务器失败的时候,读取缓存

    Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
    // 非标准Http协议,改变缓存模式为REQUEST_FAILED_READ_CACHE
    request.setCacheMode(CacheMode.REQUEST_FAILED_READ_CACHE);
    ...
    3. 如果发现有缓存直接成功,没有缓存才请求服务器

    我们知道ImageLoader的核心除了内存优化外,剩下一个就是发现把内地有图片则直接使用,没有则请求服务器,所以NoHttp这一点非常使用做一个ImageLoader。

    Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
    // 非标准Http协议,改变缓存模式为IF_NONE_CACHE_REQUEST
    request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST);
    ...
    请求图片,缓存图片。

    // 如果没有缓存才去请求服务器,否则使用缓存,缓存图片演示
    Request<Bitmap> request = NoHttp.createImageRequest(imageUrl);
    request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST);
    ...

    4. 仅仅读取缓存

    Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
    // 非标准Http协议,改变缓存模式为ONLY_READ_CACHE
    request.setCacheMode(CacheMode.ONLY_READ_CACHE);
    ...
    注意:缓存不管是String、Json、图片还是任何请求都可以被NoHttp缓存

    二、响应

    OnResponseListener<String> responseListener = new OnResponseListener<String>() {
        @Override
        public void onStart(int what) {
            // 请求开始时,可以显示一个Dialog
        }
     
        @Override
        public void onFinish(int what) {
            // 请求接受时,关闭Dialog
        }
     
        @Override
        public void onSucceed(int what, Response<String> response) {
            // 接受请求结果
            String result = response.get();
            // Bitmap imageHead = response.get(); // 如果是bitmap类型,都是同样的用法
        }
     
        @Override
        public void onFailed(int what, String url, Object tag, Exception exception, ...) {
            // 请求失败或者发生异常
            // 这里根据exception处理不同的错误,比如超时、网络不好等
        }
    };

    三. 自定义请求类型: FastJsonRequest

    1.定义请求对象

    public class FastJsonRequest extends RestRequestor<JSONObject> {
     
    public FastJsonRequest(String url) {
        super(url);
    }
     
    public FastJsonRequest(String url, RequestMethod requestMethod) {
        super(url, requestMethod);
    }
     
    @Override
    public JSONObject parseResponse(String url, Headers headers, byte[] responseBody) {
        String result = StringRequest.parseResponseString(url, headers, responseBody);
        JSONObject jsonObject = null;
        if (!TextUtils.isEmpty(result)) {
            jsonObject = JSON.parseObject(result);
        } else {
            // 这里默认的错误可以定义为你们自己的数据格式
            jsonObject = JSON.toJSON("{}");
        }
        return jsonObject;
    }
     
    @Override
    public String getAccept() {
        // 告诉服务器你接受什么类型的数据, 会添加到请求头的Accept中
        return "application/json;q=1";
    }
     
    }

    2.使用自定义请求-和NoHttp默认请求没有区别

    Request<JSONObject> mRequest = new FastJsonRequest(url, requestMethod);
    queue.add(what, mRequest, responseListener);

    五. 下载文件

    发起下载请求

    //下载文件
    downloadRequest = NoHttp.createDownloadRequest(url, fielDir, fileName, true, false);
    // what 区分下载
    // downloadRequest 下载请求对象
    // downloadListener 下载监听
    CallServer.getDownloadInstance().add(0, downloadRequest, downloadListener);

    暂停或者停止下载

    1
    downloadRequest.cancel();
    监听下载过程

    private DownloadListener downloadListener = new DownloadListener() {
        @Override
        public void onStart(int what, boolean resume, long preLenght, Headers header, long count) {
        }
     
        @Override
        public void onProgress(int what, int progress, long downCount) {
            // 更新下载进度
        }
     
        @Override
        public void onFinish(int what, String filePath) {
        }
     
        @Override
        public void onDownloadError(int what, StatusCode code, CharSequence message) {
        }
     
        @Override
        public void onCancel(int what) {
        }
    };

    原文:http://www.oschina.net/p/nohttp

  • 相关阅读:
    Node 12 值得关注的新特性
    vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式
    解决Vuex刷新页面数据丢失问题 ---- vuex-persistedstate持久化数据
    博客搬迁到 gitHub + hexo 去了, 博客园以后比较少更新
    Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器
    GET 和 POST 的区别 以及为什么 GET请求 比 POST请求 更快
    Git常用命令及使用,GitLab/GitHub初探,Git/Svn区别
    pc端结合canvas实现简单签名功能
    N的阶乘末尾0的个数和其二进制表示中最后位1的位置
    实现一个动态存储分配
  • 原文地址:https://www.cnblogs.com/sharecenter/p/5620976.html
Copyright © 2020-2023  润新知