美文网首页androidandroid成神之路正能量使者
OkHttpUtils一个专注于让网络请求更简单的框架

OkHttpUtils一个专注于让网络请求更简单的框架

作者: 廖子尧 | 来源:发表于2016-06-21 11:50 被阅读73459次

    一句话概括,OkHttpUtils一个专注于让网络请求更简单的网络请求框架,对于任何形式的网络请求只需要一行代码。

    • 项目地址:https://github.com/jeasonlzy/okhttp-OkGo
    • 联系方式:QQ群(489873144)
    • 如果你想直接运行apk看效果,点击这里下载:okhttputils_v1.8.1.apk
    • 其中Demo中用到的图片选择是我的另一个开源项目,完全仿微信的图片选择库,自带 矩形图片裁剪 和 圆形图片裁剪 功能,有需要的可以去下载使用,附上地址:https://github.com/jeasonlzy/ImagePicker
    • 其中的九宫格控件也是我的开源项目,类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件,自动根据图片的数量确定图片大小和控件大小,使用Adapter模式设置图片,对外提供接口回调,使用接口加载图片,支持任意的图片加载框架,如 Glide,ImageLoader,Fresco,xUtils3,Picasso 等,支持点击图片全屏预览大图。附上地址:https://github.com/jeasonlzy/NineGridView

    1.OkHttpUtils 目前支持

    • 一般的 get,post,put,delete,head,options请求
    • 基于Post的大文本数据上传
    • 多文件和多参数统一的表单上传
    • 支持一个key上传一个文件,也可以一个Key上传多个文件
    • 大文件下载和下载进度回调
    • 大文件上传和上传进度回调
    • 支持cookie的内存存储和持久化存储,支持传递自定义cookie
    • 支持304缓存协议,扩展四种本地缓存模式,并且支持缓存时间控制
    • 支持301、302重定向
    • 支持链式调用
    • 支持可信证书和自签名证书的https的访问,支持双向认证
    • 支持根据Tag取消请求
    • 支持自定义泛型Callback,自动根据泛型返回对象

    2.OkHttpServer 扩展功能

    2.1 统一的文件下载管理(DownloadManager):

    • 结合OkHttpUtils 的request进行网络请求,支持与OkHttpUtils 保持相同的全局公共参数,同时支持请求传递参数
    • 支持断点下载,支持突然断网,强杀进程后,断点依然有效
    • 支持 下载 暂停 等待 停止 出错 完成 六种下载状态
    • 所有下载任务按照taskKey区分,切记不同的任务必须使用不一样的key,否者断点会发生覆盖
    • 相同的下载url地址如果使用不一样的taskKey,也会认为是两个下载任务
    • 默认同时下载数量为3个,默认下载路径/storage/emulated/0/download,下载路径和下载数量都可以在代码中配置
    • 下载文件名可以自己定义,也可以不传,框架自动解析响应头或者url地址获得文件名,如果都没获取到,使用default作为文件名
    • 下载管理使用了服务提高线程优先级,避免后台下载时被系统回收

    2.2 统一的文件上传管理(UploadManager)

    • 结合OkHttpUtils 的request进行网络请求,支持与OkHttpUtils 保持相同的全局公共参数,同时支持请求传递参数
    • 上传只能使用Post, Put, Delete, Options 这四种请求,不支持Get, Head
    • 该上传管理为简单管理,不支持断点续传或分片上传,只是简单的将所有上传任务使用线程池进行了统一管理
    • 默认同时上传数量为1个,该数列可以在代码中配置修改
    • 由于断点分片上传的技术需要大量的服务端代码配合,同时也会极大的增加客户端代码量,所以综合考虑,该框架不做实现。如果确实有特殊需要,可以自己做扩展。

    项目的效果图如下:


    项目主页
    请求详细信息
    下载管理列表页
    下载管理详情页
    上传管理和图片选择

    3.如何选择网络框架

    说了这么多功能,我们来看看为什么要使用OkHttpUtils这个框架。
    首先目前主流的几个网络框架

    • android-async-http
    • xUtils
    • volley
    • retrofit
    • okhttp

    在此引用知乎上Stay Zhang的回答:

    我们来先说一个常识性的错误:volley, retrofit, android-async-http 帮你封装了具体的请求,线程切换以及数据转换。而OkHttp 是基于http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟HttpClient, HttpUrlConnection的职责是一样的。

    所以不要混淆。

    -----以下纯个人主观见解
    首先,我想即使你单纯使用OkHttp,还是会再包一层的,这样就等价于Volley之流的框架,只是封装的好与坏而已。

    android-async-http内部实现是基于HttpClient, 想必你肯定知道6.0之后HttpClient是不是系统自带的了,不过它在最近的更新中将HttpClient的所有代码copy了一份进来,所以还能使用。

    Volley是官方出的,volley在设计的时候是将具体的请求客户端做了下封装:HurlStack,也就是说可以支持HttpUrlConnection, HttpClient, OkHttp,相当于模版模式吧,这样解耦还是非常方便的,可以随意切换,如果你之前使用过Volley,并习惯使用,那直接写个OkHttp扩展就行了。

    Retrofit因为也是square出的,所以大家可能对它更崇拜些。Retrofit的跟Volley是一个套路,但解耦的更彻底:比方说通过注解来配置请求参数,通过工厂来生成CallAdapter,Converter,你可以使用不同的请求适配器(CallAdapter), 比方说RxJava,Java8, Guava。你可以使用不同的反序列化工具(Converter),比方说json, protobuff, xml, moshi等等。关键是想要用好这个框架,最好是和RxJava联用,否者和普通的网络框架也没什么区别,而对于RxJava,特别team人数多的情况下,总得有个完全精通的吧,万一掉坑里了呢。。。

    4.OkHttpUtils的优势

    • 优势一:性能高,专注于简单易用的网络请求,使用主流的okhttp进行封装,对于okhttp大家都知道,在Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了,并且支持HTTP2/SPDY黑科技,支持socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,拥有队列线程池,轻松写并发。
    • 优势二:特有的网络缓存模式,是大多数网络框架所不具备的,说一个应用场景,老板说我们的app不仅需要在有网的情况下展示最新的网络数据,还要在没网的情况下使用缓存数据,这时候是不是项目中出现了大量的代码判断当前网络状况,根据不同的状态保存不同的数据,然后决定是否使用缓存。细想一下,这是个通用的写法,于是OkHttpUtils提供了四种缓存模式,让你不用关心缓存的实现,而专注于数据的处理。(具体缓存的使用方法请看最后第四章节)。
    • 优势三:方便易用的扩展接口,可以添加全局的公共参数,全局拦截器,全局超时时间,更可以对单个请求定制拦截器,超时时间,请求参数修改等等,在使用上更是方便,原生支持的链式调用让你的请求更加清晰。
    • 优势四:强大的Cookie保持策略,我们知道在客户端对cookie的获取是个不太简单的事情,特别是还要处理cookie的过期时间,持久化策略等等,OkHttpUtils帮你彻底解决Cookie的难题,默认拥有内存存储和持久化存储两种实现,cookie全程自动管理,并且提供了额外的addCookie方式,允许介入到自动管理的过程中,添加你想创建的任何cookie。

    所以就说这么多啦,选最适合项目的,选大多数人选择的,选简单易用的,就这么个标准,而OkHttpUtils正是在这种情况下诞生啦!!

    5.使用方法

    • 对于Android Studio的用户,可以选择添加:
        compile 'com.lzy.net:okhttputils:1.8.1'  //可以单独使用,不需要依赖下方的扩展包
        compile 'com.lzy.net:okhttpserver:1.0.3' //扩展了下载管理和上传管理,根据需要添加
    
        compile 'com.lzy.net:okhttputils:+'  //版本号使用 + 可以自动引用最新版
        compile 'com.lzy.net:okhttpserver:+' //版本号使用 + 可以自动引用最新版
    
    • 为了方便大家使用,更加通俗的理解http的网络协议,建议做网络请求的时候,对每个请求抓包后查看请求信息和响应信息。
    • 如果是 Windows 操作系统,可以使用 Fiddler 对手机的请求进行抓包查看。
    • 如果是 Mac OS 操作系统,可以使用 Charles 对手机的请求进行抓包查看。
    • 具体的下载地址和抓包配置方法,我这就不提供了,请自行百度或谷歌。

    6.使用注意事项

    • okhttputils使用的okhttp的版本是最新的 3.4.1 版本,和以前的 2.x 的版本可能会存在冲突。
    • okhttpserver是对okhttputils的扩展,统一了下载管理和上传管理,对项目有需要做统一下载的可以考虑使用该扩展,不需要的可以直接使用okhttputils即可。
    • 对于缓存模式使用,需要与返回对象相关的所有javaBean必须实现Serializable接口,否者会报NotSerializableException
    • 使用缓存时,如果不指定cacheKey,默认是用url带参数的全路径名为cacheKey
    • 使用该网络框架时,必须要在 Application 中做初始化 OkHttpUtils.init(this);

    一、全局配置

    一般在 Aplication,或者基类中,只需要调用一次即可,可以配置调试开关,全局的超时时间,公共的请求头和请求参数等信息,所有的请求参数都支持中文,

        @Override
        public void onCreate() {
            super.onCreate();
    
            HttpHeaders headers = new HttpHeaders();
            headers.put("commonHeaderKey1", "commonHeaderValue1");    //所有的 header 都 不支持 中文
            headers.put("commonHeaderKey2", "commonHeaderValue2");
            HttpParams params = new HttpParams();
            params.put("commonParamsKey1", "commonParamsValue1");     //所有的 params 都 支持 中文
            params.put("commonParamsKey2", "这里支持中文参数");
    
            //必须调用初始化
            OkHttpUtils.init(this);
            //以下都不是必须的,根据需要自行选择
            OkHttpUtils.getInstance()//
                    .debug("OkHttpUtils")                                              //是否打开调试
                    .setConnectTimeout(OkHttpUtils.DEFAULT_MILLISECONDS)               //全局的连接超时时间
                    .setReadTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)                  //全局的读取超时时间
                    .setWriteTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)                 //全局的写入超时时间
                  //.setCookieStore(new MemoryCookieStore())                           //cookie使用内存缓存(app退出后,cookie消失)
                  //.setCookieStore(new PersistentCookieStore())                       //cookie持久化存储,如果cookie不过期,则一直有效
                    .addCommonHeaders(headers)                                         //设置全局公共头
                    .addCommonParams(params);                                          //设置全局公共参数
        }
    

    二、普通请求

    1.基本的网络请求

    OkHttpUtils.get(Urls.URL_METHOD)     // 请求方式和请求url
        .tag(this)                       // 请求的 tag, 主要用于取消对应的请求
        .cacheKey("cacheKey")            // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
        .cacheMode(CacheMode.DEFAULT)    // 缓存模式,详细请看缓存介绍
        .execute(new JsonCallback<RequestInfo>(RequestInfo.class) {
            @Override
            public void onResponse(boolean isFromCache, RequestInfo requestInfo, Request request, @Nullable Response response) {
                // requestInfo 对象即为所需要的结果对象
            }
        });
    

    2.请求 Bitmap 对象

    OkHttpUtils.get(Urls.URL_IMAGE)//
        .tag(this)//
        .execute(new BitmapCallback() {
            @Override
            public void onResponse(boolean isFromCache, Bitmap bitmap, Request request, @Nullable Response response) {
            // bitmap 即为返回的图片数据
            }
        });
    

    3.请求 文件下载

    OkHttpUtils.get(Urls.URL_DOWNLOAD)//
        .tag(this)//
        .execute(new FileCallback("/sdcard/temp/", "file.jpg") {  //文件下载时,需要指定下载的文件目录和文件名
            @Override
            public void onResponse(boolean isFromCache, File file, Request request, @Nullable Response response) {
            // file 即为文件数据,文件保存在指定布幕
            }
        });
    

    4.普通Post,直接上传String类型的文本

    一般此种用法用于与服务器约定的数据格式,当使用该方法时,params中的参数设置是无效的,所有参数均需要通过需要上传的文本中指定,此外,额外指定的header参数仍然保持有效。

    OkHttpUtils.post(Urls.URL_TEXT_UPLOAD)//
        .tag(this)//
        .postString("这是要上传的长文本数据!")//
        .execute(new StringCallback() {
            @Override
            public void onResponse(boolean isFromCache, String s, Request request, @Nullable Response response) {
                //上传成功
            }
        });
    

    5.普通Post,直接上传Json类型的文本

    该方法与postString没有本质区别,只是数据格式是json,一般来说,需要自己创建一个实体bean或者一个map,把需要的参数设置进去,然后通过三方的Gson或者fastjson转换成json字符串,最后直接使用该方法提交到服务器。

    OkHttpUtils.post(Urls.URL_TEXT_UPLOAD)//
        .tag(this)//
        .postJson("{\"des\": \"这里面要写标准的json格式数据\"}")//
        .execute(new StringCallback() {
            @Override
            public void onResponse(boolean isFromCache, String s, Request request, @Nullable Response response) {
                //上传成功
            }
        });
    

    6.请求功能的所有配置讲解

    以下代码包含了以下内容:

    • 一次普通请求所有能配置的参数,真实使用时不需要配置这么多,按自己的需要选择性的使用即可
    • 多文件和多参数的表单上传,同时支持进度监听
    • 自签名网站https的访问,调用setCertificates方法即可
    • 为单个请求设置超时,比如涉及到文件的需要设置读写等待时间多一点。
    • Cookie一般情况下只需要在初始化的时候调用setCookieStore即可实现cookie的自动管理,如果特殊业务需要,需要手动额外向服务器传递自定义的cookie,可以在每次请求的时候调用addCookie方法,该方法提供了3个重载形式,可以根据自己的需要选择使用。
    OkHttpUtils.get(Urls.URL_METHOD) // 请求方式和请求url, get请求不需要拼接参数,支持get,post,put,delete,head,options请求
        .tag(this)               // 请求的 tag, 主要用于取消对应的请求
        .connTimeOut(10000)      // 设置当前请求的连接超时时间
        .readTimeOut(10000)      // 设置当前请求的读取超时时间
        .writeTimeOut(10000)     // 设置当前请求的写入超时时间
        .cacheKey("cacheKey")    // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
        .cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST) // 缓存模式,详细请看第四部分,缓存介绍
        .setCertificates(getAssets().open("srca.cer")) // 自签名https的证书,可变参数,可以设置多个
        .addInterceptor(interceptor)            // 添加自定义拦截器
        .headers("header1", "headerValue1")     // 添加请求头参数
        .headers("header2", "headerValue2")     // 支持多请求头参数同时添加
        .params("param1", "paramValue1")        // 添加请求参数
        .params("param2", "paramValue2")        // 支持多请求参数同时添加
        .params("file1", new File("filepath1")) // 可以添加文件上传
        .params("file2", new File("filepath2")) // 支持多文件同时添加上传
        .addUrlParams("key", List<String> values)  //这里支持一个key传多个参数
        .addFileParams("key", List<File> files) //这里支持一个key传多个文件
        .addFileWrapperParams("key", List<HttpParams.FileWrapper> fileWrappers) //这里支持一个key传多个文件
        .addCookie("aaa", "bbb")                // 这里可以传递自己想传的Cookie
        .addCookie(cookie)                    // 可以自己构建cookie
        .addCookies(cookies)                    // 可以一次传递批量的cookie
         //这里给出的泛型为 RequestInfo,同时传递一个泛型的 class对象,即可自动将数据结果转成对象返回
        .execute(new DialogCallback<RequestInfo>(this, RequestInfo.class) {
            @Override
            public void onBefore(BaseRequest request) {
                // UI线程 请求网络之前调用
                // 可以显示对话框,添加/修改/移除 请求参数
            }
        
            @Override
            public RequestInfo parseNetworkResponse(Response response) throws Exception{
                // 子线程,可以做耗时操作
                // 根据传递进来的 response 对象,把数据解析成需要的 RequestInfo 类型并返回
                // 可以根据自己的需要,抛出异常,在onError中处理
                return null;
            }
        
            @Override
            public void onResponse(boolean isFromCache, RequestInfo requestInfo, Request request, @Nullable Response response) {
                // UI 线程,请求成功后回调
                // isFromCache 表示当前回调是否来自于缓存
                // requestInfo 返回泛型约定的实体类型参数
                // request     本次网络的请求信息,如果需要查看请求头或请求参数可以从此对象获取
                // response    本次网络访问的结果对象,包含了响应头,响应码等,如果数据来自于缓存,该对象为null
            }
        
            @Override
            public void onError(boolean isFromCache, Call call, @Nullable Response response, @Nullable Exception e) {
                // UI 线程,请求失败后回调
                // isFromCache 表示当前回调是否来自于缓存
                // call        本次网络的请求对象,可以根据该对象拿到 request
                // response    本次网络访问的结果对象,包含了响应头,响应码等,如果网络异常 或者数据来自于缓存,该对象为null
                // e           本次网络访问的异常信息,如果服务器内部发生了错误,响应码为 400~599之间,该异常为 null
            }
        
            @Override
            public void onAfter(boolean isFromCache, @Nullable RequestInfo requestInfo, Call call, @Nullable Response response, @Nullable Exception e) {
                // UI 线程,请求结束后回调,无论网络请求成功还是失败,都会调用,可以用于关闭显示对话框
                // isFromCache 表示当前回调是否来自于缓存
                // requestInfo 返回泛型约定的实体类型参数,如果网络请求失败,该对象为 null
                // call        本次网络的请求对象,可以根据该对象拿到 request
                // response    本次网络访问的结果对象,包含了响应头,响应码等,如果网络异常 或者数据来自于缓存,该对象为null
                // e           本次网络访问的异常信息,如果服务器内部发生了错误,响应码为 400~599之间,该异常为 null
            }
        
            @Override
            public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
                // UI 线程,文件上传过程中回调,只有请求方式包含请求体才回调(GET,HEAD不会回调)
                // currentSize  当前上传的大小(单位字节)
                // totalSize   需要上传的总大小(单位字节)
                // progress     当前上传的进度,范围 0.0f ~ 1.0f
                // networkSpeed 当前上传的网速(单位秒)
            }
        
            @Override
            public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
                // UI 线程,文件下载过程中回调
                //参数含义同 上传相同
            }
        });
    

    7.取消请求

    每个请求前都设置了一个参数tag,取消则通过OkHttpUtils.cancel(tag)执行。
    例如:在Activity中,当Activity销毁取消请求,可以在onDestory里面统一取消。

        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            //根据 Tag 取消请求
            OkHttpUtils.getInstance().cancelTag(this);
        }
    

    8.同步的请求

    execute方法不传入callback即为同步的请求,返回Response对象,需要自己解析

        Response response = OkHttpUtils.get("http://www.baidu.com")//
                                        .tag(this)//
                                        .headers("aaa", "111")//
                                        .params("bbb", "222")
                                        .execute();
    

    三、自定义CallBack使用

    目前内部提供的包含AbsCallback, StringCallBack ,BitmapCallback ,FileCallBack ,可以根据自己的需求去自定义Callback

    • AbsCallback: 所有回调的父类,抽象类
    • StringCallBack:如果返回值类型是纯文本数据,即可使用该回调
    • BitmapCallback:如果请求的是图片数据,则可以使用该回调
    • FileCallBack:如果要做文件下载,则必须使用该回调,内部封装了关于文件下载进度回调的方法

    该网络框架的核心使用方法即为Callback的继承使用,详细请看 Demo 源码中callback包下的代码。

    因为不同的项目需求,可能对数据格式进行了不同的封装,于是在 Demo 中的进行了详细的代码示例,以下是详细介绍:

    • CommonCallback:继承自AbsCallback,主要作用是做全局共同请求参数的添加,同样也可以在第一步全局配置的时候设置,效果一样。
    • EncryptCallback:继承自CommonCallback,主要功能是做 Url 参数加密,对每个请求的参数进行编码,防止拦截数据包,篡改数据。
    • JsonCallback:继承自EncryptCallback,一般来说,服务器返回的响应码都包含 code,msg,data 三部分,在此根据自己的业务需要完成相应的逻辑判断,并对数据进行解析,可以使用 Gson 或者 fastjson,将解析的对象返回。
    • DialogCallback:继承自JsonCallback,对需要在网络请求的时候显示对话框,使用该回调。
    • StringDialogCallback:继承自EncryptCallback,如果网络返回的数据只是纯文本,使用该回调
    • BitmapDialogCallback :继承自BitmapCallback,如果网络返回的是Bitmap对象,使用该回调
    • DownloadFileCallBack :继承自FileCallback,如果需要做文件下载,使用该回调

    以上基本是包含了大部分的业务逻辑,具体情况请参照demo示例,根据业务需求修改!

    四、缓存的使用

    使用缓存前,必须让缓存的数据javaBean对象实现Serializable接口,否者会报NotSerializableException

    因为缓存的原理是将对象序列化后直接写入 数据库中,如果不实现Serializable接口,会导致对象无法序列化,进而无法写入到数据库中,也就达不到缓存的效果。

    目前提供了四种CacheMode缓存模式

    • DEFAULT: 按照HTTP协议的默认缓存规则,例如有304响应头时缓存
    • REQUEST_FAILED_READ_CACHE:先请求网络,如果请求网络失败,则读取缓存,如果读取缓存失败,本次请求失败。该缓存模式的使用,会根据实际情况,导致onResponse,onError,onAfter三个方法调用不只一次,具体请在三个方法返回的参数中进行判断。
    • IF_NONE_CACHE_REQUEST:如果缓存不存在才请求网络,否则使用缓存。
    • FIRST_CACHE_THEN_REQUEST:先使用缓存,不管是否存在,仍然请求网络,如果网络顺利,会导致onResponse方法执行两次,第一次isFromCache为true,第二次isFromCache为false。使用时根据实际情况,对onResponse,onError,onAfter三个方法进行具体判断。

    无论对于哪种缓存模式,都可以指定一个cacheKey,建议针对不同需要缓存的页面设置不同的cacheKey,如果相同,会导致数据覆盖。

    相关文章

      网友评论

      • 壹二三亖:想问问大神图片上传怎么做
      • fragment1:请求https链接的时候怎么操作 ?
      • e4f685522b4e:就是我一个页面启动了多个请求,然后怎么判断所有接口请求成功了 因为我是要做一个取消加载框的操作,在所有接口请求成功了过后就取消加载框
      • yang2010:okhttp
        自带缓存功能,你又有数据库缓存,这样可能缓存两遍
      • 你好我是老杨:网络框架还是自己封装吧,不同的项目不同的需求,处理错误信息也不同。。这样的框架可以用来下载上传图片什么的。。。网络请求还是自己封装吧。。
      • 简单点说话的方式简单点:引入我的项目后,混淆后一直报警告,使用了你的混淆也没用,无解?
        Warning:okio.DeflaterSink: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
        Warning:okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
      • f29a00aa86ba:postJson怎么不支持
      • _love_me:10-10 15:11:01.516 5503 5503 E dalvikvm: Could not find class 'okhttp3.OkHttpClient$Builder', referenced from method com.lzy.okhttputils.OkHttpUtils.<init>
        10-10 15:11:01.516 5503 5503 W dalvikvm: VFY: unable to resolve new-instance 9267 (Lokhttp3/OkHttpClient$Builder;) in Lcom/lzy/okhttputils/OkHttpUtils;
        10-10 15:11:01.518 5503 5503 W dalvikvm: VFY: unable to find class referenced in signature (Lokhttp3/Interceptor;)
        10-10 15:11:01.518 5503 5503 I dalvikvm: Could not find method okhttp3.OkHttpClient$Builder.addInterceptor, referenced from method com.lzy.okhttputils.OkHttpUtils.addInterceptor
        10-10 15:11:01.518 5503 5503 W dalvikvm: VFY: unable to resolve virtual method 64527: Lokhttp3/OkHttpClient$Builder;.addInterceptor (Lokhttp3/Interceptor;)Lokhttp3/OkHttpClient$Builder;
        10-10 15:11:01.518 5503 5503 W dalvikvm: VFY: unable to find class referenced in signature (Lokhttp3/OkHttpClient;)

        在4.4.4的系统 出现这个 怎么解决
      • 18b4eaf9eced:《OkHttpUtils一个专注于让网络请求更简单的框架 - 简书》写的挺不错的,已经收藏了。

        源码解析:http://tinyurl.com/ycqn86hj


        8afe04d66ee7:写的不错,谢谢博主;已 收 藏~
      • 我相信你爱过gg:留个位置 找起来方便
      • 黄宏发:能够在人性化一点就好了,比如说前端发起网络请求,请求成功了,然后后端以失败的形式返回失败的结果给到前端,这个时候并没有把后端返回的body直接返回给上一层。
      • Aleyn_:怎么上传图片并添加参数呢,小弟菜鸟,望大神解答。
      • Android_Iven:项目正在用这个。感觉比retrofit还方便。😊
      • 71ab45a13ae1:这是我看到最全面的介绍了 可惜鸿神已经不再维护了
      • e55bdf8ac54b:请问 ,这个框架可以不加key上传文件吗
      • b75a61ccddc5:楼主你好,我是安卓开发的新手,看了你写的框架好多不明白的地方。请指点迷津。
        1.这个OkHttpUtils和okGO是同一个框架么?
        2.OkHttpUtils里面的文件下载支持断点下载么。如果支持的话APP退出再进来怎么获得下载 的进度呢
        3.这个DownloadManager如何使用呢,不知道是否有使用手册。

        谢谢了
      • 发疯的2魅:没有人使用进行https访问吗
        廖子尧: @发疯的2魅 详细加github首页qq群里交流吧。。
      • TonyEasy:怎么打印请求的地址和参数?
        廖子尧: @TonyEasy 详细加github首页qq群里交流吧。。
        廖子尧: @YouthForever 已经升级3.0.1了,欢迎在github查看。。
      • oO百味Oo:post上传,参数的值可以为数组吗?
        廖子尧: @oO百味Oo 详细加github首页qq群里交流吧。。
      • _love_me:同一个请求相隔5s请求两次 ,第二次成功了,第一次的没成功,原因是什么
        廖子尧: @_love_me 详细加github首页qq群里交流吧。。
      • _Insomnia_:你好,你这个好像不支持mediaType吧
      • _love_me:post请求设置params时,params键值对的时候,值是中文,在服务端接受变成乱码
      • 小新哥的大梦想:666,这个五一好好学习一下,膜拜大神:+1:
      • 简书取名好难:点击强大的缓存这个item是闪退
      • 就不呵呵呵2:学习了,不错,谢谢作者
      • 李晓通:在没有网络的情况下发送请求为什么直接crash啊?还是说只有我一个人有这个问题?
      • 359c10098bcd:多谢了,亲,不过我的java基础学的不够好,所以对回调不是很懂
      • 相互交流:楼主有文章,介绍整个框架实现的过程吗,想学习学习思路??
      • 相互交流:有关于https的封装吗?
        廖子尧: @相互交流 有。。https只需要一行代码配置。其余与http一样使用。。
      • smartapple:使用okgo进行下载不支持断点续传??
        是不是我又哪里设置不对。。。。。。。。。。。 :disappointed_relieved:
        廖子尧: @四条眼的小胖子 okserver扩展支持。
      • smartapple:想用此框架做一个下载的功能 ,包括断点续传 多线程 进度 暂停 ,看文章说需要使用这个类DownloadManager,可是找了几圈没有找到怎么使用啊? 还望大神给点提示,谢谢
        廖子尧: @四条眼的小胖子文档并没有写太多关于downloadmanager的用法。。主要看demo的源码。有详细的注释
      • 9b93085a22e2:大神,我用你那个demo 的fragment的懒加载有一个问题,不知道怎么解决额。就是第一次都会调用那个initData()方法,但是再次调用的时候又一个间隔他没有调到,就是重复这样
        廖子尧: @小菜鸟_张 详细加github首页qq群里交流吧。。
      • be3c7fdedf7a:你好,缓存可以自定义目录吗,如果不可以那我可以自定义吗?怎么弄?请大神指教
        廖子尧:@jimbocn 缓存在数据库。不可以指定目录。。
        be3c7fdedf7a:@廖子尧
      • Cliper:厉害了我的哥!!!
      • 过期的薯条:这个封装的框架我有俩点疑问:1.执行网络请求访问,还需要自己开线程,不然报错提示:在主线程中运行网络请求 2多个博客都是 全局application中的。
        OkHttpUtils.init(this);必须初始化。我没写为什么没得错误
      • 爱笑逗猴子:大神,发现问题所在啦,在我频繁切换同一个界面,调用同一个接口的时候,都会走到baserequest的execute中的call.enqueue,但是频繁访问几次之后,写的回调就不执行啦,是调度阻塞了么,有么有解决办法呀
      • and_pu:早该看这篇文章了,之前只不过简单的用了一下,没想到只是冰山一角
      • 986bf444e0ae:网络请求错误时,onError()方法会执行,并且response.body.toString()方法能返回json数据,但是这个json无论是在Activity里还是在Callback里都无法Gson实例化,所以有一个重大的问题就是,服务器返回了错误数据,但是前端无法提示出来啊,请问如何解决
        986bf444e0ae:@尛坏蛋 你没有看懂我的意思,举个例子,登录的时候,如果密码输入错误,后台会提示你“账号或密码错误”,这个框架无法实例化后台返回来的这句json。
        尛坏蛋:@qs73 醉了,这个他框架什么事?你自己的错误处理还要框架来全帮你做好?最起码得空判断,格式错误等等,你自己处理,还需要看懂线程切换。不然怎么提示。想用好别人的框架就得把他所有东西全部拆开来看!
        c3f1ada035f0:@qs73 同问 我也有遇到
      • 笔绘丹心:请问https单项加密可以使用普通请求吗
      • 笔绘丹心:果然是大神
      • adfc522de08e:得到的response不为空,可是在下一步做 String jsonString = response.body().string();之后发现得到的jsonString是空的,是什么原因呀?
        廖子尧: @adfc522de08e 详细加github首页qq群里交流吧。。
        8cadff7ff9b0:@qs73 我也碰到了 你解决了么
      • GISirFive:好多项目都有依赖关系,想独立使用真的很难啊!
      • 5cb9dccb65a5:想问下,缓存为什么不用Okhttp自带的Cache,还要自己写呢,这个它自带的缓存有什么缺点么
        3Q竹林:发现个线程问题,如下:

        @Override
        public void onAfter(boolean isFromCache,。。。){
        // 这里应该不是UI线程,而是仍处在子线程中
        }
        5cb9dccb65a5:@廖子尧 明白了,多谢
        廖子尧: @痕迹空 自带的缓存只能实现标准的http协议,304相关的缓存,这个缓存可以有四种缓存模式,兼容304的协议。功能更强大
      • 6fe46d50b2d8:想问一下您的这个库与https://github.com/hongyangAndroid/okhttp-utils这个库比最大的改进或者优化是什么呢?
        廖子尧: @无齿晓人 详细加github首页qq群里交流吧。。
        Everglow_111:洪洋的没有加断点续传,项目没有需求也够用了
        tpkeeper:@无齿晓人 小白同问
      • 捡淑:66666
      • 1220a273ae78:点个赞
      • 爱笑逗猴子:大神,你的框架已经应用到项目中,但是最近测试时发现访问一段网络后,再进行访问就无任何反应,前提是开启debug模式,不知道问题出在哪里,求指点。。 :grin:
        廖子尧:@爱笑逗猴子 你看看控制台,是否有异常信息。。javabean有没序列化
        爱笑逗猴子:@廖子尧 设置啦默认的缓存模式,没反应就是进入到请求的方法中,但是不会进入到失败的回调,成功的回调也不会进,debug也没有任何信息,汗~也不是总是这样,只是很偶尔会这样,必须杀死程序,才能继续访问下载数据。。 :disappointed_relieved:
        廖子尧:@爱笑逗猴子 是否设置了缓存模式,没有反应是什么意思。。
      • pengpengli:我的eclipse 引入四个jar后会报Conversion to Dalvik format failed with error 1
        查了好长时间不知道是什么原因 看网上说是 sdk 但是我都更新了 还是不行
        pengpengli:还是报同样的错误呢,要是不集成这三个jar项目就能跑
        廖子尧:@39bd2959349c 你先不用okhttpserver试试,三个jar就可以了。。
        pengpengli:@39bd2959349c 显示这 Dx no classfiles specified 完了是这Conversion to Dalvik format failed with error 1
      • Thomas__Yang:子尧大神果然6666666
      • 尛坏蛋:写的还可以,就是层级混乱,很多东西调用来调用去
        尛坏蛋:@尛坏蛋 真正看过你写的这整套代码的人绝对会慎重考虑的,已经写的很好了,我有认真的看过。
        尛坏蛋: @廖子尧 你这个框架代码我都看过一遍,个人觉得,你由上而下的那几个层级里面,下面的调用上面,上面的调用上面,我感觉这样很不好,比如你的Content,和Delivery,你每个request实现都会有去getInstant.xxxx,我个人觉得不好吧,还有就是有些方法全抽到basic里面去了,再一个你的cookie持久化有些小问题
        廖子尧: @尛坏蛋 具体点,哪里的层级混乱。。
      • 7f734210adf0:整合的很不错,学习了
      • d8b16493a9d5:666666666666

      本文标题:OkHttpUtils一个专注于让网络请求更简单的框架

      本文链接:https://www.haomeiwen.com/subject/hfhgdttx.html