zoukankan      html  css  js  c++  java
  • Android--第三方控件--okHttp

      Android中有很多的第三方控件,其中OkHttp是一个很强大的用于网络加载的第三方框架,当然了,它的内部也是使用原生的代码封装好的。今天我们就来看一下OkHttp的简单用法:

      说到网络请求,肯定就分get和post两种了,这里我们说一下get和post的简单实用:

      首先我们需要先在我们的项目中引入OkHttp的依赖,在你的项目的gradle下面的dependencies下添加依赖:

     

    1 compile 'com.squareup.okhttp3:okhttp:3.4.1'

      然后同步项目,会自动下载OkHttp相关的依赖。或者也可以这样,选中此工作空间的设置:

    ----》选中你要添加依赖(要使用OkHttp)的项目,选择添加类库依赖

    在搜索框中输入你想要下载的第三方框架,点搜索哪个按钮,选中想要下载的,点击OK,完成。

    1. Get方式:我们先看一段代码:
       1 private void httpget() {
       2         //okhttpclient :okthttp主要类
       3         OkHttpClient   client=new OkHttpClient();
       4         /*
       5         Request:请求服务端
       6         Request.Builder():设计模式:将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示,他的每一个属性的设置都返回一个builder对象,也就是说可以一直使用.XX的形式为其设置属性
       7         build:结束,返回Request对象
       8          */
       9         Request request=new Request.Builder().url(path).build();
      10         //Call 将你的请求封装成任务
      11         Call call=client.newCall(request);
      12         //请求调度
      13         call.enqueue(new Callback() {
      14             //失败
      15             @Override
      16             public void onFailure(Call call, IOException e) {
      17 
      18             }
      19             //成功
      20             @Override
      21             public void onResponse(Call call, Response response) throws IOException {
      22                 //返回String
      23                 String json=response.body().string();
      24                 Log.i("TAG","----->get"+json);
      25                 //返回byte[]
      26                             response.body().bytes();
      27                 //返回流
      28                             response.body().byteStream();
      29             }
      30         });
      31     }

        如上所示,我们要使用OkHttp的时候,首先要先new一个OkHttpClient对象,OkHttpClient是其一个主要的类,Response对象用来构建我们需要额外传递的值(如head,method等)和一些其他需要设置的参数,而Call对象是用来封装任务并执行调度的。我们调用call.enqueue()方法,将call加入调度队列,在enqueue()方法中我们通过匿名内部类的形式实现这个CallBack接口,并实现其中的两个方法,onFailure()方法是请求网络失败的时候会执行的方法,onResponse()是请求成功的时候会执行的方法。我们主要看onResponse()方法,可以看到,我们在onResponse()方法中通过回传的Response对象得到我们想要的网络请求的数据。通过response.body()方法我们能得到ResponseBody对象,在这个对象中我们可以通过方法获得到字符串、字节数组和输入流。也就是说这个地方是支持大文件下载的。不过也说明了onResponse()方法不是在主线程中执行的,同样的,onFailure()方法也是在子线程中执行,只要我们调用了enqueue(),OkHttp会为我们开启一个子线程。我们可以通过使用handler来实现UI更新。当然,我们也可以像这样通过call.excute()方法直接返回一个Response()对象:

      1 OkHttpClient client = new OkHttpClient();
      2         Request request = new Request.Builder().url(path).build();
      3         try {
      4             Response res = client.newCall(request).execute();
      5             Log.d("tag", "onResponse: "+res.body().string());
      6         } catch (IOException e) {
      7             e.printStackTrace();
      8         }
    2. Post方式:
       1 private void httppost() {
       2         //okhttpclient :okthttp主要类
       3         OkHttpClient client=new OkHttpClient();
       4         /*
       5         RequestBody:请求体,携带参数去服务端访问
       6         FormBody:设置表单参数,用它来设置要携带的参数
       7         FormBody.Builder():设计模式:将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
       8         build:结束,返回一个RequestBody
       9          */
      10         RequestBody body=new FormBody.Builder().add("name","xiaoming").add("age","18").build();
      11         //创建Request
      12         Request request=new Request.Builder().url(path).post(body).build();
      13         //Call 将你的请求封装成任务
      14         Call call=client.newCall(request);
      15         //请求调度
      16         call.enqueue(new Callback() {
      17             //失败
      18             @Override
      19             public void onFailure(Call call, IOException e) {
      20 
      21             }
      22             //成功
      23             @Override
      24             public void onResponse(Call call, Response response) throws IOException {
      25                    String  json= response.body().string();
      26                 Log.i("TAG","----->post"+json);
      27 
      28                 response.body().byteStream();
      29                        response.body().bytes();
      30             }
      31         });
      32     }

      get方式请求如果熟悉了,post其实与它一样,只是在构建的时候需要多传递几个参数而已。可以看到,我们在上面构建Request对象的时候先构建了一个RequestBody对象,有代码可见,RequestBody对象也是一个Builder设计模式,设置完参数后不要忘了调用其build()方法完成构建。在封装Request对象的时候有点不同:

      1  Request request=new Request.Builder().url(path).post(body).build();

        可以看到我们在设置了其url属性后又调用了post,并将刚才构建的RequestBody()对象传递进去。这说明我们使用的post方式。下面的请求调度方法与get相同,不再赘述。

      可以看到,网络访问的代码还是不少的,如果每次网络访问我们都要写这么多的代码的话,那可毁了,所以我们下面去封装一个工具类,这里以get方式为例:

     1 package ggcomic.rabbit.lx.ggcomic.utils;
     2 
     3 import java.io.IOException;
     4 
     5 import okhttp3.Call;
     6 import okhttp3.OkHttpClient;
     7 import okhttp3.Request;
     8 import okhttp3.Response;
     9 
    10 /**
    11  * OkHttp网络加载(单例模式)
    12  * Created by Lx on 2016/9/12.
    13  */
    14 public class OkHttpUtils {
    15     public OkHttpUtils() {
    16     }
    17 
    18     public static OkHttpUtils okHttpUtils = new OkHttpUtils();
    19 
    20     public static OkHttpUtils getInstance() {
    21         return okHttpUtils;
    22     }
    23 
    24     OkHttpClient client = new OkHttpClient();
    25 
    26     /**
    27      * 官方
    28      * 直接得到string字符串
    29      * @param path
    30      * @return
    31      * @throws IOException
    32      */
    33     public String run(String path) throws IOException {
    34         Request request = new Request.Builder().url(path).build();
    35         //官方封装的方法,没有请求调度,在使用该工具类的时候要启动一个线程,
    36         // 使用client.newCall(request).enqueue(new CallBack(){...})的时候不需要启动线程
    37         Response response = client.newCall(request).execute();
    38         return response.body().string();
    39     }
    40 
    41     /**
    42      * 非官方
    43      * 获得call实例
    44      * @param path
    45      * @return
    46      */
    47     public Call getCallInstance(String path) {
    48         Request request = new Request.Builder().url(path).build();
    49         Call call = client.newCall(request);
    50         return call;
    51     }
    52 
    53 }

    这里我们使用了单例模式的饿汉式写法。这里工具类的写法有两种,一种是官方的,一种是非官方的,看代码可以知道,官方封装的方法无法处理请求失败时的操作,因为它直接返回给我们一个Response对象,而非官方的是我自己的写法,这里返回一个Call对象,我们在代码中使用非官方的写法:

     1 OkHttpUtils.getInstance().getCallInstance(String url).enqueue(new Callback() {
     2             @Override
     3             public void onFailure(Call call, IOException e) {
     4                 handler.post(new Runnable() {
     5                     @Override
     6                     public void run() {
     7                         //网络连接失败时的操作
     8                     }
     9                 });
    10             }
    11 
    12             @Override
    13             public void onResponse(Call call, Response response) throws IOException {
    14                 //网络连接成功时的操作
    15             }
    16         });

    我们先是调用getInstance()方法得到一个OkHttp实例,然后再调用其中的方法,在里面完成相应的操作即可。

    到这里OkHttp的简单的使用就结束了,其实算算没有多少代码,还是比较简单的对吧~如果想要深入的了解OkHttp,请移文鸿洋大神的这篇博客:

    Android OkHttp完全解析 是时候来了解OkHttp了

    写的特别的全面。

  • 相关阅读:
    wince 下,拨号成功,但不能打开网页的问题
    Wince platform configure filesdetail
    WINCE ERRORMSG
    wince 6 s3c2440 io port opearation
    wince 6 kernel configure files
    赞cnblogs
    WINCE DEBUGMSG
    POJ3249 Test for Job DAG最短路
    HDU4552 怪盗基德的挑战书 KMP | 后缀数组 | 暴力
    HDU4554 叛逆的小明 水题
  • 原文地址:https://www.cnblogs.com/RabbitLx/p/5886846.html
Copyright © 2011-2022 走看看