Android--第三方控件--okHttp
2016-09-19 21:51
267 查看
Android中有很多的第三方控件,其中OkHttp是一个很强大的用于网络加载的第三方框架,当然了,它的内部也是使用原生的代码封装好的。今天我们就来看一下OkHttp的简单用法:
说到网络请求,肯定就分get和post两种了,这里我们说一下get和post的简单实用:
首先我们需要先在我们的项目中引入OkHttp的依赖,在你的项目的gradle下面的dependencies下添加依赖:
然后同步项目,会自动下载OkHttp相关的依赖。或者也可以这样,选中此工作空间的设置:
----》选中你要添加依赖(要使用OkHttp)的项目,选择添加类库依赖
在搜索框中输入你想要下载的第三方框架,点搜索哪个按钮,选中想要下载的,点击OK,完成。
Get方式:我们先看一段代码:
如上所示,我们要使用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()对象:
Post方式:
get方式请求如果熟悉了,post其实与它一样,只是在构建的时候需要多传递几个参数而已。可以看到,我们在上面构建Request对象的时候先构建了一个RequestBody对象,有代码可见,RequestBody对象也是一个Builder设计模式,设置完参数后不要忘了调用其build()方法完成构建。在封装Request对象的时候有点不同:
可以看到我们在设置了其url属性后又调用了post,并将刚才构建的RequestBody()对象传递进去。这说明我们使用的post方式。下面的请求调度方法与get相同,不再赘述。
可以看到,网络访问的代码还是不少的,如果每次网络访问我们都要写这么多的代码的话,那可毁了,所以我们下面去封装一个工具类,这里以get方式为例:
这里我们使用了单例模式的饿汉式写法。这里工具类的写法有两种,一种是官方的,一种是非官方的,看代码可以知道,官方封装的方法无法处理请求失败时的操作,因为它直接返回给我们一个Response对象,而非官方的是我自己的写法,这里返回一个Call对象,我们在代码中使用非官方的写法:
我们先是调用getInstance()方法得到一个OkHttp实例,然后再调用其中的方法,在里面完成相应的操作即可。
到这里OkHttp的简单的使用就结束了,其实算算没有多少代码,还是比较简单的对吧~如果想要深入的了解OkHttp,请移文鸿洋大神的这篇博客:
说到网络请求,肯定就分get和post两种了,这里我们说一下get和post的简单实用:
首先我们需要先在我们的项目中引入OkHttp的依赖,在你的项目的gradle下面的dependencies下添加依赖:
compile 'com.squareup.okhttp3:okhttp:3.4.1'
然后同步项目,会自动下载OkHttp相关的依赖。或者也可以这样,选中此工作空间的设置:
----》选中你要添加依赖(要使用OkHttp)的项目,选择添加类库依赖
在搜索框中输入你想要下载的第三方框架,点搜索哪个按钮,选中想要下载的,点击OK,完成。
Get方式:我们先看一段代码:
private void httpget() { //okhttpclient :okthttp主要类 OkHttpClient client=new OkHttpClient(); /* Request:请求服务端 Request.Builder():设计模式:将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示,他的每一个属性的设置都返回一个builder对象,也就是说可以一直使用.XX的形式为其设置属性 build:结束,返回Request对象 */ Request request=new Request.Builder().url(path).build(); //Call 将你的请求封装成任务 Call call=client.newCall(request); //请求调度 call.enqueue(new Callback() { //失败 @Override public void onFailure(Call call, IOException e) { } //成功 @Override public void onResponse(Call call, Response response) throws IOException { //返回String String json=response.body().string(); Log.i("TAG","----->get"+json); //返回byte[] response.body().bytes(); //返回流 response.body().byteStream(); } }); }
如上所示,我们要使用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()对象:
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url(path).build(); try { Response res = client.newCall(request).execute(); Log.d("tag", "onResponse: "+res.body().string()); } catch (IOException e) { e.printStackTrace(); }
Post方式:
private void httppost() { //okhttpclient :okthttp主要类 OkHttpClient client=new OkHttpClient(); /* RequestBody:请求体,携带参数去服务端访问 FormBody:设置表单参数,用它来设置要携带的参数 FormBody.Builder():设计模式:将一个复杂的对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示 build:结束,返回一个RequestBody */ RequestBody body=new FormBody.Builder().add("name","xiaoming").add("age","18").build(); //创建Request Request request=new Request.Builder().url(path).post(body).build(); //Call 将你的请求封装成任务 Call call=client.newCall(request); //请求调度 call.enqueue(new Callback() { //失败 @Override public void onFailure(Call call, IOException e) { } //成功 @Override public void onResponse(Call call, Response response) throws IOException { String json= response.body().string(); Log.i("TAG","----->post"+json); response.body().byteStream(); response.body().bytes(); } }); }
get方式请求如果熟悉了,post其实与它一样,只是在构建的时候需要多传递几个参数而已。可以看到,我们在上面构建Request对象的时候先构建了一个RequestBody对象,有代码可见,RequestBody对象也是一个Builder设计模式,设置完参数后不要忘了调用其build()方法完成构建。在封装Request对象的时候有点不同:
Request request=new Request.Builder().url(path).post(body).build();
可以看到我们在设置了其url属性后又调用了post,并将刚才构建的RequestBody()对象传递进去。这说明我们使用的post方式。下面的请求调度方法与get相同,不再赘述。
可以看到,网络访问的代码还是不少的,如果每次网络访问我们都要写这么多的代码的话,那可毁了,所以我们下面去封装一个工具类,这里以get方式为例:
package ggcomic.rabbit.lx.ggcomic.utils; import java.io.IOException; import okhttp3.Call; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * OkHttp网络加载(单例模式) * Created by Lx on 2016/9/12. */ public class OkHttpUtils { public OkHttpUtils() { } public static OkHttpUtils okHttpUtils = new OkHttpUtils(); public static OkHttpUtils getInstance() { return okHttpUtils; } OkHttpClient client = new OkHttpClient(); /** * 官方 * 直接得到string字符串 * @param path * @return * @throws IOException */ public String run(String path) throws IOException { Request request = new Request.Builder().url(path).build(); //官方封装的方法,没有请求调度,在使用该工具类的时候要启动一个线程, // 使用client.newCall(request).enqueue(new CallBack(){...})的时候不需要启动线程 Response response = client.newCall(request).execute(); return response.body().string(); } /** * 非官方 * 获得call实例 * @param path * @return */ public Call getCallInstance(String path) { Request request = new Request.Builder().url(path).build(); Call call = client.newCall(request); return call; } }
这里我们使用了单例模式的饿汉式写法。这里工具类的写法有两种,一种是官方的,一种是非官方的,看代码可以知道,官方封装的方法无法处理请求失败时的操作,因为它直接返回给我们一个Response对象,而非官方的是我自己的写法,这里返回一个Call对象,我们在代码中使用非官方的写法:
OkHttpUtils.getInstance().getCallInstance(String url).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { handler.post(new Runnable() { @Override public void run() { //网络连接失败时的操作 } }); } @Override public void onResponse(Call call, Response response) throws IOException { //网络连接成功时的操作 } });
我们先是调用getInstance()方法得到一个OkHttp实例,然后再调用其中的方法,在里面完成相应的操作即可。
到这里OkHttp的简单的使用就结束了,其实算算没有多少代码,还是比较简单的对吧~如果想要深入的了解OkHttp,请移文鸿洋大神的这篇博客:
Android OkHttp完全解析 是时候来了解OkHttp了
写的特别的全面。相关文章推荐
- 每周总结20130821——android控件的尺寸、http文件上传
- android第三方开源控件
- android请求网络——第三方库android-async-http的使用(1)
- Android第三方控件——百度地图的使用
- Android中Http网络请求库框架Volley和Asnyc-http的使用---第三方库学习笔记(一)
- 转载Android常见错误(http://www.cnblogs.com/ok-lanyan/archive/2011/10/12/2208378.html)
- Android中Http网络请求库Asnyc-http的使用第三方库
- Android网络架构之———OkHttp+Volley+Gson
- android下拉刷新控件之第三方开源控件的使用实现
- Android第三方异步网路加载库AsyncHttpClient
- android打包准备:混淆第三方jar包(Gson, greenDao,sharesdk,UIL,高德地图, unity,pinyin4j,async http,JPush,EventBus等)
- 【Android笔记】引用第三方自定义控件出错:Tip: Use View.isInEditMode() in your custom views to skip code when shown in Eclipse
- Android Network --------------关于Android自带的org.apache.http和apache官方的(第三方的)HttpClient的问题
- Android控件使用手册:使用WebView打开http://www.baidu.com
- 12_Android中HttpClient的应用,doGet,doPost,doHttpClientGet,doHttpClient请求,另外借助第三方框架实现网络连接的应用,
- Android 第三方应用接入微信平台研究情况分享(一) 详细出处参考:http://www.jb51.net/article/33048.htm
- 【第三方控件】Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- Android针对http请求的第三方开源框架AsynHttpClient
- android请求网络——第三方库android-async-http的使用(3)
- Android学习摘记——添加第三方开源控件(PullToRefresh例子笔记)