OkHttp架构——三层网络架构封装(最实用的框架)
2017-01-13 12:05
387 查看
图片是以截图开源中国的登录界面
介绍
开发中我们要使用到不同的网络的工具,如xUtils、OKHttp、NoHttp等工具,根据开发的不同情况,需要更换工具,这样在Activity需要不断的更换代码,耦合性比较高。因此我们需要来搭建网络架构,进行架构封装,解耦操作,优化代码量,降低耦合性
1、登录Activity请求数据为例,对OkHttp进行封装
这是一段OKHttp网络工具使用的普遍流程,用来请求登录的账户和密码数据,这样使用的弊端:1.代码量比价冗杂
2.在获取不同的数据的时候,代码重复率高,网络对象不断创建,消耗内存
3.在更该网络地址或者网络工具的时候,需要进行一个一个更改,并且修改你自己的源码。浪费时间,降低工作效率
public class LoginActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); log(); } /**登录方法**/ private void log() { //获取实例 OkHttpClient client = new OkHttpClient.Builder() .readTimeout(3000, TimeUnit.MILLISECONDS)//获取数据并读取数据的超时时间 .connectTimeout(3000,TimeUnit.MILLISECONDS)//连接超时时间 .build(); String url = "http://www.oschina.com/api?action=login&account=xx&password=xx";//登录请求数据 //获取请求 Request request = new Request.Builder().url(url).build(); Call call = client.newCall(request); //实现回调 call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { //获取数据成功 String json = response.body();//获取Json数据或者Xml数据,以字符串形式展示 //InputStream inputStream = response.body().byteStream();或者是获取数据字符输入流 } @Override public void onFailure(Call call, IOException e) { //获取数据失败 } }); }
一:第一层封装
1、提取 NetClient,整个任务栈中保证只有一个OkHttpClient对象就行
public class NetClient { private final OkHttpClient client; private OkHttpClient getClient(){ //获取实例 OkHttpClient client = new OkHttpClient.Builder() .readTimeout(3000, TimeUnit.MILLISECONDS)//获取数据并读取数据的超时时间 .connectTimeout(3000,TimeUnit.MILLISECONDS)//连接超时时间 .build(); return client; } }
2、实现NetClient的单例模式,保证只有一个对象
public class NetClient { private static NetClient netClient; private NetClient(){ client = getClient(); } //单例模式 public static NetClient getInstance(){ if (netClient==null){ netClient = new NetClient(); } return netClient; } private final OkHttpClient client; private OkHttpClient getClient(){ //获取实例 OkHttpClient client = new OkHttpClient.Builder() .readTimeout(3000, TimeUnit.MILLISECONDS)//获取数据并读取数据的超时时间 .connectTimeout(3000,TimeUnit.MILLISECONDS)//连接超时时间 .build(); return client; } }
3、封装请求方法
public class NetClient { private static NetClient netClient; private NetClient(){ client = getClient(); } public static NetClient getInstance(){ if (netClient==null){ netClient = new NetClient(); } return netClient; } private final OkHttpClient client; private OkHttpClient getClient(){ //获取实例 OkHttpClient client = new OkHttpClient.Builder() .readTimeout(3000, TimeUnit.MILLISECONDS)//获取数据并读取数据的超时时间 .connectTimeout(3000,TimeUnit.MILLISECONDS)//连接超时时间 .build(); return client; } //封装请求方法,传入一个url,以及使用自己定义的接口 MyCallBack 1:为什么要自己定义callback接口呢? 因为我们如果不更换接口,继续使用OKHttp的callback,你一旦更换网络工具,你的源码就必须的更改 public void doGet(String url, final MyCallBack callback){ Request request = new Request.Builder().url(url).build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 更新界面.. callback.onFailure(-1); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.code()==200){ InputStream inputStream = response.body().byteStream(); callback.onResponse(inputStream); }else{ callback.onFailure(response.code()); } } }); } }
二:第二层封装
1、自定义接口MyCallBack。解耦网络回调。API 可以不再关心底层的网络类。
public interface MyCallBack { void onFailure(int code);//失败方法,参数是请求码,来判断获取数据的情况 void onResponse(InputStream in);//请求成功,传入一个输入流参数 }
三:第三层封装
1、 提取 NetApi ,封装 API 请求参数。界面上可以不再关心网络参数在NetApi中定义logIN方法,这样就实现网络参数更改变动,“一处改,百处变”
public class NetApi { private static final String HOST = "http://www.oschian.com/"; public static void login(String account, String password, MyCallBack callback) { String url = HOST + "api?action=login&name="+account+"&mima="+password; NetClient.getInstance().doGet(url,callback); } }
2、最后Activity中代码实现网络请求,只需要一行代码就可以
public class LoginActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); log(); } /**登录请求**/ private void log() { NetApi.login("xxx","xxx",new MyCallBack() { @Override public void onFailure(int code) { // 获取数据失败 } @Override public void onResponse(InputStream in) { // 解析数据, 更新界面.. } }); } }
相关文章推荐
- okhttp网络框架的封装实用
- OkHttpUtils - 封装了okhttp的网络框架
- OkHttpUtils - 封装了okhttp的网络框架
- 优雅设计封装基于Okhttp3的网络框架(一):Http网络协议与Okhttp3解析
- 优雅设计封装基于Okhttp3的网络框架(六):HttpHeader接口设计实现 及 Response、Request封装实现
- 对 okhttp 网络框架的封装 easy-okhttp 推荐 国产 网络工具包
- OkHttpUtils - 封装了okhttp的网络框架
- OkHttpUtils - 封装了okhttp的网络框架
- 网络请求框架(二)----改善的okHttp封装库okhttputils的使用
- 如何封装自己的网络框架(RxJava+okHttp+Retrofit)
- 优雅设计封装基于Okhttp3的网络框架(五):多线程、单例模式优化 及 volatile、构建者模式使用解析
- Android 的OkHttp 网络请求框架的学习封装
- OkHttpUtils - 封装了okhttp的网络框架
- 优雅设计封装基于Okhttp3的网络框架(二):多线程下载功能原理设计 及 简单实现
- 封装了okhttp的网络框架,支持大文件上传下载,上传进度...
- OKHttp网络请求封装好的框架
- 基于Retrofit、OkHttp、Gson封装通用网络框架
- Android网络请求框架----Okhttp3完全解析(2),封装框架
- Android--menu和OkHttp框架(未封装),结合Executors(线程池)实现网络请求的案例
- 优雅设计封装基于Okhttp3的网络框架(三):多线程下载功能核心实现 及 线程池、队列机制、终止线程解析