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

简介: 一、什么是“有多种可替代解决方案的业务逻辑”?举几个例子说明:  客户端的http请求操作,可以实现的方案有Retrofix、OkHttp、Volley等;  客户端的数据库存储方案可以为Realm、greenDao、OrmLite等;  图片加载的方案可以是Fresco、Glide、Picasso、UIL等。

一、什么是“有多种可替代解决方案的业务逻辑”?

举几个例子说明:

 客户端的http请求操作,可以实现的方案有Retrofix、OkHttp、Volley等;

 客户端的数据库存储方案可以为Realm、greenDao、OrmLite等;

 图片加载的方案可以是Fresco、Glide、Picasso、UIL等。  

二、如何快速替换?

先来描述一下需求,比如说,目前正在用的http请求是Volley,现在发现使用OkHttp来封装一套会更好。又比方说,目前正在用的数据存储方案是OrmLite,现在使用greenDao或者Realm会更好,在类似这些情况下,如何做到不修改Activity/Fragment/Presenter代码的情况下,把Volley的http请求实现更换成Okhttp的实现,把OrmLite更换成greenDao或者Realm?

解决问题的关键词:设计模式中的——工厂方法模式。

本质:利用接口进行解耦。

说到这里,可能很多有经验的朋友已经会心一笑,是的,老实说这篇文章可能对老司机没有太大的意义,但是如果看到这里还是心存疑问,或者你不知道什么是工厂方法模式,也不知道如何使用接口解耦什么的,没关系,请继续往下看。

三、Talk is cheap, show me the code.

    下面,我们就用Volley更换到OkHttp这个例子来说明一下如何做到不修改Activity/Fragment/Presenter的代码情况下,更快地更换业务逻辑实现的代码。

    在开始之前先来思考一下上述所说“可替代解决方案”的含义,为何这些方案是可替代的?是因为它们具有相同的共性,它们所要解决的问题是相同的,比如说http请求框架,无论是Volley/OkHttp/Retrofix,它们所要实现的都是http请求中的get/post/put/delete这些方法,数据库存储框架中无论是Realm/greenDao/OrmLite,它们要实现的都是增删改查这些方法。

    “博主你别再瞎逼逼,赶紧说重点…”

    我:dalao我错了,下面说重点…

   先来概括一下我们的实现思路:

        把http请求框架的共性方法抽取到接口中,我们把这个接口称为“请求接口”;

        创建一个用于返回请求结果的接口,我们把这个接口称为“回调接口”;

        分别用Volley和OkHttp实现“请求接口”;

       创建一个类来返回上述接口的对象,我们把这个类叫做“工厂”类;

        在Activity/Fragment/Presenter中,使用“工厂”返回的这个接口对象调用get/post/put/delete方法,并在“回调接口”中得到请求结果。

    本文完整代码   https://github.com/AweiLoveAndroid/HttpRequestProcessor ,可以先clone到本地再看文章,为了方便阅读,下文中的代码将省略非重点部分。

四、具体步骤:

Step1:把http请求框架的共性方法抽取到接口中(也就是上述说的get/post/put/delete这些方法)


       上面的IRequestManager接口中用到的请求结果回调接口——IRequestCallback


    至此,我们已经把数据请求的接口,以及数据返回的接口都定义好了,整理一下思绪

        ● 1.首先我们搞清楚http请求,有哪些方法,需要有哪些参数——IRequestManager;

        ● 2.数据返回会有什么情况?——IRequestCallback;

Step2:用Volley来实现IRequestManager这个接口


        VolleyRequestManager实现了IRequestManager接口,到这里我想你也看出来可以使用VolleyRequestManager来进行get/post/put/delete操作了,是的,已经可以用于请求操作,但是我们先不这样做,原因请继续往下看Step3。

Step3:创建一个类来返回IRequestManager请求接口的对象


       到这里,请容许我再逼逼一下,为什么要用这种方法来返回对象,而不直接在Activity/Fragment/Presenter中创建VolleyRequestManager对象来进行操作?如果直接在Activity/Fragment/Presenter中使用VolleyRequestManager来创建对象,你的代码就依赖了VolleyRequestManager,这种情况下,如果要更换成OkHttp,岂不是要把代码中所有的VolleyRequestManager对象也更换成OkHttp的请求对象?再试想一下,如果你有很多个Activity/Fragment/Presenter使用了VolleyRequestManager对象,你是不是要每个地方都更换一遍?

        使用RequestFactory的方式在Activity/Fragment/Presenter中创建对象,代码只依赖了IRequestManager这个接口,这就是使用接口进行解耦的关键点,无论在什么地方使用了这个接口,当要更换实现的时候,只需要修改RequestFactory中return的实现类就可以了。

Step4:调用上述方法进行测试


        注意我们创建请求对象的代码,这里没有出现具体的实现类:

       IRequestManager requestManager = RequestFactory.getRequestManager();

Step5:不更改MainActivity中任何代码,把Http请求的逻辑替换成OkHttp来实现

    1)先用OkHttp来实现IRequestManager这个接口.


    2) 使用OkHttp更换Volley

        现在我们用OkHttp的请求方式也实现了一套get/post/put/delete的请求方法,此时只要修改Step3中,返回的对象为OkHttpRequestManager对象,就已经完成了我们整个http请求框架的更换,此时,你可以完全移除Volley的引用以及代码,而不会对程序有任何影响。



总结:

对于有多种可替代解决方案的业务逻辑,我的解耦思路是这样的:

    1. 抽取它们的共性方法到接口中;

    2. 使用自己选择的实现方案去实现;

    3. 使用“工厂”类把具体实现转换成抽象接口,并返回抽象接口对象;

    4. Activity/Fragment/Presenter中,使用“工厂”中返回的接口进行操作,而不要依赖于其实现类。

    5. 要更换方案的时候,只需要修改“工厂”中返回的实现类。

后记:

这篇文章只是提供一种解耦思想,而不是“如何封装http请求框架”的教程,也不是讨论“哪个http请求框架好用”的文章,当然,你完全可以用这种方法进行http请求的封装。欢迎大家提出宝贵意见。

我在原作者的基础上加了另一种和实现方式,这是github地址 可以去下载看看

我写的 网络请求隔离框架github下载地址


引用原文网址:对于有多种可替代解决方案的业务逻辑,提供一种快速更换的思路


【好消息】我的微信公众号正式开通了,关注一下吧!

关注一下我的公众号吧
相关文章
|
7天前
|
存储 SQL 安全
网络安全与信息安全:守护数字世界的坚盾在这个高度数字化的时代,网络安全和信息安全已经成为个人、企业乃至国家安全的重要组成部分。本文将深入探讨网络安全漏洞、加密技术以及安全意识的重要性,旨在为读者提供一个全面的网络安全知识框架。
随着互联网技术的飞速发展,网络安全问题日益凸显。从个人信息泄露到企业数据被盗,再到国家安全受到威胁,网络安全事件层出不穷。本文将从网络安全漏洞的定义与分类入手,探讨常见的网络攻击手段;随后深入解析加密技术的原理及其在保护信息安全中的作用;最后强调提升公众与企业的安全意识的重要性,并提出具体的建议。通过综合运用这些知识点,我们可以更好地构建起一道道坚固的防线,守护我们的数字世界。
|
9天前
|
编解码 分布式计算 网络协议
Netty高性能网络框架(一)
Netty高性能网络框架(一)
|
2月前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
2月前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
116 56
|
15天前
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
81 3
|
23天前
|
编译器 Android开发 开发者
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
40 8
完成切换网络+修改网络连接图标提示的代码框架
完成切换网络+修改网络连接图标提示的代码框架
|
2月前
|
设计模式 Java Android开发
探索安卓应用开发:从新手到专家的旅程探索iOS开发中的SwiftUI框架
【8月更文挑战第29天】本文旨在通过一个易于理解的旅程比喻,带领读者深入探讨安卓应用开发的各个方面。我们将从基础概念入手,逐步过渡到高级技术,最后讨论如何维护和推广你的应用。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的代码示例。让我们一起开始这段激动人心的旅程吧!
|
2月前
|
存储 算法 Java
Java中的集合框架深度解析云上守护:云计算与网络安全的协同进化
【8月更文挑战第29天】在Java的世界中,集合框架是数据结构的代言人。它不仅让数据存储变得优雅而高效,还为程序员提供了一套丰富的工具箱。本文将带你深入理解集合框架的设计哲学,探索其背后的原理,并分享一些实用的使用技巧。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
2月前
|
小程序 数据安全/隐私保护
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
在 `src/http` 目录下创建 `request.ts` 文件,并配置 Taro 的网络请求方法 `Taro.request`,支持多种 HTTP 方法并处理数据加密。
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
下一篇
无影云桌面