实现Android主流网络框架封装,可无缝侵入切换框架

·  阅读 2745

版权声明:本文为博主原创文章,未经博主允许不得转载。juejin.cn/post/684490…

转载请标明出处:juejin.cn/post/684490…

本文出自 AWeiLoveAndroid的博客 juejin.cn/user/298153…

一、项目中经常会用到图片加载框架,关于框架使用,在开发中会遇到以下几种情况:

1.时间紧任务重,来不及去重构项目。
2.项目很老,接手的人很多,不同的人使用的不同的网络请求框架。有的人追求最新的技术,就用到了最新的框架。
3.领导(组长)要求你用某个网络框架,由于自身技术原因,项目耦合很严重,你没办法把以前的网络库代码全部去掉,只能采用最新的网络框架去写新功能。
4.老图片框架过时了,不适应项目发展需要了,有新的更好用的性能更高的框架可以替代。
5.没有对框架进行封装,直接用框架里面的API运用自己的app中。
6.有一个简单的utils工具类,但是封装的不完整,后续可维护性很差。
复制代码

如果你的项目出现了以上几个问题的,其实你有必要看看这篇博文了。这篇博文,老司机带你封装一个图片隔离型框架,只需要一行代码切换图片框架库,并且不会对你原始代码里面的调用产生任何影响。是不是很6?(此处应该点赞)

这篇文章只是提供一种解耦思想,关于如何封装网络请求就不在本文讨论范围之内。本文旨在解决开发中遇到的问题。

下面,我们就简单讲解一下如何做到不修改项目中的实际代码情况下,更快地更换业务逻辑实现的代码,真正做到一行代码切换网络框架?


本文同步发布在我的github 欢迎star 地址:github.com/AweiLoveAnd…


二、为什么使用我这个框架?

首先我们来看看不同的人是怎么使用网络框架的:

(1)普通程序猿做法:

AActivity: 

    new Okhttp(...);
    
BActivity:

    new Okhttp(...);
    
CActivity:

    new Okhttp(...);
复制代码

然后你会发现假如某一天因为开源库出了bug,或者你要切换到Retrofit或者其他网络库,你会发现耦合太严重了,那么多类都要去修改,非常麻烦。即使你用的是MVP,你也会发现修改这一部分网络库的代码也是很麻烦的。

(2)中级程序猿做法:

他们知道封装网络库,甚至直接找一些封装好的开发库拿来直接用,伪代码如下:

OKHttpUtils.get().params(map).url(XXX);
复制代码

然后你会发现所有的Activity或者Fragment或者Presenter里面到处都会看到 以下代码

OKHttpUtils.get().params(map).url(XXX);
复制代码

然后你会发现假如某一天因为开源库出了bug,或者你要切换到Retrofit或者其他网络库,你会发现那么多类都要去修改,非常麻烦。

(3)我的做法:

好戏登场了!既然这么麻烦,我为什么不使用一套隔离型框架去规避这些风险呢?具体的封装细节我隐藏起来,我只暴露接口出去,你要切换哪个框架,一行代码就搞定了,框架的切换细节我都在内部处理了。

这样一来,我们开发中不会去管我到底是用的是什么网络库,我们只管使用框架就好了,省事省力。

下面来一张我画的价值100W的架构图解!未经允许,请勿私自转发,侵权必究!!!!!

下面我来说说实现的细节:

三、如实实现?

1.首先抽取共性的接口

一般我们使用网络框架的时候都需要4大要素:请求方式请求url请求参数请求回调

我们写一个接口IhttpProcessor封装这些要素。然后请求回调也是一个接口ICallback,封装的是成功和失败两个方法。

2.我们就以OKHttp为例,写一个类OkHttpProcessor实现IhttpProcessor接口,这里面具体写操作OKHttp的逻辑。

同样的,其他的网络库比如volley,也可以写一个类叫做VolleyProcessor实现IhttpProcessor接口,里面具体写操作Volley的逻辑。

3.写一个类叫做HttpCallback,实现ICallback接口,处理实体类和json解析操作。

4.真正核心类:代理类HttpHelper,实现IhttpProcessor接口,这个类就把实现了 IhttpProcessor接口的类 以及实现ICallback接口的类连接起来,真正达到代理作用。

四、源码

源码请看我的github,欢迎star!

github.com/AweiLoveAnd…

我这个库里面有工厂模式实现的 ,也有代理模式实现的,推荐大家关注代理模式实现的,我给出的示范是代理模式的使用。关于okhttp或者volley更具体的封装我没做,我这个库主要是解决开发中一键切换网络库这个问题而诞生的。我们重要的是要掌握封装的思想。有了网络库的封装,其他的封装都很好说了,比如图片库,数据库,其他UI库的封装都是同理。

最后:大家如果有什么疑问,欢迎留言。我是阿韦,致力于框架设计研究,欢迎一起来学习探讨!