okhttp的使用及详解

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         }

 

你可能感兴趣的:(安卓基础)