OKHttp的原理及源码查看器实现: okhttp概念: 用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来) 作用:减少对服务器的请求次数,减少请求延迟,减少数据流量,缓存响应数据来减少重复的网络请求,自动处理GZip压缩,客户端不管是使用 HttpClient 还是 OkHttp 都可以在请求头里加上 gzip 属性,加上该属性后会自动使用 gzip 压缩发送数据。 1. get请求 2. post请求 3. 基于Http的文件上传 4. 文件下载 5. 加载图片(内部会根据imageview的大小自动对图片进行合适的压缩。虽然不适合一次性加载大量图片的场景,但是对于app中偶尔有几个图片的加载,还是可用的) 6. 支持请求回调,直接返回对象、对象集合 7. 支持session的保持 OKhttp下载地址:https://github.com/hongyangAndroid/okhttp-utils Android Studio的用户: 使用Studio的图形管理进行添加.(注意:okhttp有2.0版本和3.0以后的版本,这两个版本有的方法使用上有些许的不同) Eclipse的用户: 可以下载最新的jar okhttp he latest JAR ,添加依赖就可以用了。 最新的jar地址:okio the latest JAR 注意:okhttp内部依赖okio,别忘了同时导入okio: 注意:使用网络在清单文件添加权限: <uses-permission android:name='android.permission.INTERNET'/> 使用: (一)Http Get的使用步骤: 对了网络加载库,最常见的是http get请求了,比如获取一个网页的内容。 OkHttpClient mOkHttpClient=new OkHttpClient(); 提示:设置超时时间在OKhttp3.0以后,使用build的方式进行OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10,TimeUnit.SECONDS) .writeTimeout(10,TimeUnit.SECONDS) .build(); 02.通过build来创建一个Request请求,没有设置get方法,而是直接设置一个url地址,默认就是一个get方式的请求.
03.创建一个call对象,参数就是Request请求对象,发送请求 Call call = mOkHttpClient.newCall(request); 04.请求加入调度
get请求的步骤总结:首先构造一个Request对象,参数必须有个url参数,当然你可以通过Request.Builder设置更多的参数比如:header、method等。 然后通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。 最后,我们希望以异步的方式去执行请求,所以我们调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。 看到这,你会发现,整体的写法还是比较长的,所以封装肯定是要做的,不然每个请求这么写,得累死。 OKHttp注意: 1. 获得返回的字符串,通过response.body().string()获取; 2. 获得返回的二进制字节数组,则调用response.body().bytes();//通过二进制字节数组,可以转换为BItmap图片资源 3. 获得返回的inputStream,则调用response.body().byteStream() ;这里支持大文件下载,有inputStream我们可以通过IO的方式写文件。 不过也说明一个问题,这个onResponse执行的线程并不是UI线程(主线程不能有耗时操作)。如果你希望操作控件,还是需要使用handler等 例如:public void onResponse(final Response response) throws IOException{ final String res = response.body().string(); runOnUiThread(new Runnable() { public void run() { TextView控件对象.setText(res); } });} (二) Http Post 携带参数的使用步骤:与get请求格式基本一致,就是Request的构造的不同。基于Http的文件,字符串,键值上传 0.0.RequestBody里所使用的上传参数的设定.(传一个字符串) 定义为成员变量:JSON:MediaType JSON = MediaType.parse('application/json; charset=utf-8');//'类型,字节码' |
|