您的位置:首页 > 理论基础 > 计算机网络

okhttp的使用及详解

2017-09-27 18:54 369 查看


okhttp的优势

  允许连接到同一个主机地址的所有请求,提高请求效率 

  共享Socket,减少对服务器的请求次数

  通过连接池,减少了请求延迟 

  缓存响应数据来减少重复的网络请求

  减少了对数据流量的消耗

  自动处理GZip压缩


okhttp的功能

  get,post请求

  文件的上传下载

  加载图片(内部会图片大小自动压缩) 

  支持请求回调,直接返回对象、对象集合

  支持session的保持


okhttp的使用

1.配置环境导包

1 dependencies {
2     ......
3     compile 'com.squareup.okhttp3:okhttp:3.7.0'
4     compile 'com.squareup.okio:okio:1.12.0'
5     ......
6 }


2.使用okhttp实现解析服务器端json文件   get请求

1 OkHttpClient okHttpClient = new OkHttpClient.Builder()
2                 //设置连接超时时间
3                 .connectTimeout(20, TimeUnit.SECONDS)
4                 //设置读取超时时间
5                 .readTimeout(20, TimeUnit.SECONDS)
6                 .build();
7         //创建一个请求对象,url指向json文件的网络地址
8         String url = "http://10.254.9.35:8080/update.json";
9         Request request = new Request.Builder()
10                 //设置请求方式
11                 .get()
12                 //设置请求路径
13                 .url(url)
14                 .build();
15         //通过客户端把请求发出去
16         Call call = okHttpClient.newCall(request);
17         //处理请求的结果
18         call.enqueue(new Callback() {
19             @Override
20             public void onFailure(Call call, IOException e) {
21                 //请求失败
22                 Log.i(TAG, "onFailure");
23                 System.out.println("请求失败");
24             }
25
26             @Override
27             public void onResponse(Call call, Response response) throws IOException {
28                 //请求成功
29                 Log.i(TAG, "onResponse");
30                 System.out.println("请求成功");
31                 //获取服务器中json数据
32                 ResponseBody body = response.body();
33                 String json = body.string();
34                 try {
35                     //解析json数据
36                     JSONObject jsonObject = new JSONObject(json);
37                     desc = jsonObject.getString("desc");
38                     downloadUrl = jsonObject.getString("downloadUrl");
39                     int remoteversionCode = jsonObject.getInt("versionCode");
40                     //解析json文件后的操作
41                          ....
42                 } catch (Exception e) {
43                     e.printStackTrace();
44                 }
45             }
46         });


3.使用okhttp下载文件

1 //判断sd卡状态是否可用
2         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
3
4             //设置sdk存储路径
5              String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "aa.apk";
6             // 使用okHttpClient进行下载
7             OkHttpClient okHttpClient = new OkHttpClient.Builder()
8                     .connectTimeout(20, TimeUnit.SECONDS)
9                     .readTimeout(20, TimeUnit.SECONDS)
10                     .build();
11             Request request = new Request.Builder()
12                     .get()
13                     .url(downloadUrl)
14                     .build();
15             okHttpClient.newCall(request).enqueue(new Callback() {
16                 @Override
17                 public void onFailure(Call call, IOException e) {
18                     //请求失败
19                 }
20
21                 @Override
22                 public void onResponse(Call call, Response response) throws IOException {
23                     //请求成功
24                     ResponseBody body = response.body();
25                     //通过字符流读取文件内容
26                     InputStream inputStream = body.byteStream();
27                     //在本地新建文件,将读取的文件内容写入在新建的本地中
28                     File file = new File(path);
29                     FileOutputStream fos = new FileOutputStream(file);
30                     int len = 0;
31                     byte[] bytes = new byte[1024];
32
33                     while ((len = inputStream.read(bytes)) != -1) {
34                         fos.write(bytes, 0, len);
35
36                     }
37
38                 }
39             });
40
41         }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android