配色: 字号:
Android--第三方控件--okHttp
2016-09-21 | 阅:  转:  |  分享 
  
Android--第三方控件--okHttp

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

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

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



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

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



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



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



?

Get方式:我们先看一段代码:

1privatevoidhttpget(){

2//okhttpclient:okthttp主要类

3OkHttpClientclient=newOkHttpClient();

4/

5Request:请求服务端

6Request.Builder():设计模式:将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示,他的每一个属性的设置都返回一个builder对象,也就是说可以一直使用.XX的形式为其设置属性

7build:结束,返回Request对象

8/

9Requestrequest=newRequest.Builder().url(path).build();

10//Call将你的请求封装成任务

11Callcall=client.newCall(request);

12//请求调度

13call.enqueue(newCallback(){

14//失败

15@Override

16publicvoidonFailure(Callcall,IOExceptione){

17

18}

19//成功

20@Override

21publicvoidonResponse(Callcall,Responseresponse)throwsIOException{

22//返回String

23Stringjson=response.body().string();

24Log.i("TAG","----->get"+json);

25//返回byte[]

26response.body().bytes();

27//返回流

28response.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()对象:

1OkHttpClientclient=newOkHttpClient();

2Requestrequest=newRequest.Builder().url(path).build();

3try{

4Responseres=client.newCall(request).execute();

5Log.d("tag","onResponse:"+res.body().string());

6}catch(IOExceptione){

7e.printStackTrace();

8}

Post方式:

1privatevoidhttppost(){

2//okhttpclient:okthttp主要类

3OkHttpClientclient=newOkHttpClient();

4/

5RequestBody:请求体,携带参数去服务端访问

6FormBody:设置表单参数,用它来设置要携带的参数

7FormBody.Builder():设计模式:将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示

8build:结束,返回一个RequestBody

9/

10RequestBodybody=newFormBody.Builder().add("name","xiaoming").add("age","18").build();

11//创建Request

12Requestrequest=newRequest.Builder().url(path).post(body).build();

13//Call将你的请求封装成任务

14Callcall=client.newCall(request);

15//请求调度

16call.enqueue(newCallback(){

17//失败

18@Override

19publicvoidonFailure(Callcall,IOExceptione){

20

21}

22//成功

23@Override

24publicvoidonResponse(Callcall,Responseresponse)throwsIOException{

25Stringjson=response.body().string();

26Log.i("TAG","----->post"+json);

27

28response.body().byteStream();

29response.body().bytes();

30}

31});

32}

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

1Requestrequest=newRequest.Builder().url(path).post(body).build();

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

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

1packageggcomic.rabbit.lx.ggcomic.utils;

2

3importjava.io.IOException;

4

5importokhttp3.Call;

6importokhttp3.OkHttpClient;

7importokhttp3.Request;

8importokhttp3.Response;

9

10/

11OkHttp网络加载(单例模式)

12CreatedbyLxon2016/9/12.

13/

14publicclassOkHttpUtils{

15publicOkHttpUtils(){

16}

17

18publicstaticOkHttpUtilsokHttpUtils=newOkHttpUtils();

19

20publicstaticOkHttpUtilsgetInstance(){

21returnokHttpUtils;

22}

23

24OkHttpClientclient=newOkHttpClient();

25

26/

27官方

28直接得到string字符串

29@parampath

30@return

31@throwsIOException

32/

33publicStringrun(Stringpath)throwsIOException{

34Requestrequest=newRequest.Builder().url(path).build();

35//官方封装的方法,没有请求调度,在使用该工具类的时候要启动一个线程,

36//使用client.newCall(request).enqueue(newCallBack(){...})的时候不需要启动线程

37Responseresponse=client.newCall(request).execute();

38returnresponse.body().string();

39}

40

41/

42非官方

43获得call实例

44@parampath

45@return

46/

47publicCallgetCallInstance(Stringpath){

48Requestrequest=newRequest.Builder().url(path).build();

49Callcall=client.newCall(request);

50returncall;

51}

52

53}

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

1OkHttpUtils.getInstance().getCallInstance(Stringurl).enqueue(newCallback(){

2@Override

3publicvoidonFailure(Callcall,IOExceptione){

4handler.post(newRunnable(){

5@Override

6publicvoidrun(){

7//网络连接失败时的操作

8}

9});

10}

11

12@Override

13publicvoidonResponse(Callcall,Responseresponse)throwsIOException{

14//网络连接成功时的操作

15}

16});

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



献花(0)
+1
(本文系白狐一梦首藏)