现象描述

当我们打开京东 app 进入首页,如果当前是没有网络的状态,里面的按钮点击是没有反应的。只有当我们打开网络的情况下,点击按钮才能跳转页面,按照我们一般人写代码的逻辑应该是这个样子:

/**
* 跳转到待收货页面
*/
public void jumpWaitReceiving() {
// 判断当前有没有网络
if(CheckNetUtil.isNetworkAvailable(this)) {
// 当前有网络我才跳转,进入待收货页面
Intent intent = new Intent(this, WaitReceivingActivity.class);
startActivity(intent);
}
} /**
* 跳转到我的钱包页面
*/
public void jumpMineWallet() {
if(CheckNetUtil.isNetworkAvailable(this)) {
Intent intent = new Intent(this, MineWalletActivity.class);
startActivity(intent);
}
}

上面这段代码看似没有任何问题,完全满足京东的网络处理需求,就写一个 if(有网) 跳转到下一个页面,没网就不做任何处理。但是真的没有问题吗? 按照京东的页面,这些 if() 代码估计要写上几十次,而且有些在 Activity,有些甚至在 Fragment 中,很难管理。如果有一天需求变动,我们估计要改动多处。我们到底有没有更好的方式,且接着往下看。

面向切面

我们现在想做的其实就是,我根本不想写那么多的 if() 代码,而且写得越多越不好管理,比如有一天没网络要弹 Toast ,那么岂不是很多地方要去改动。所以接下来,我们打算采用面向切面的编程思想,把网络检测切出来统一管理。第一,保证代码的简洁性,第二,需求有变动时我们只需要统一改动那一部分代码,第三,有很多这里不一一列出来了。

那么什么是 AOP ? 好处又有什么?

面向切面(AOP)其实就是把众多方法中的所有共有代码全部抽取出来,放置到某个地方集中管理,然后在具体运行时,再由容器动态织入这些共有代码的话,最起码可以解决两个问题:

1.1 Android程序员在编写具体的业务逻辑处理方法时,只需关心核心的业务逻辑处理,既提高了工作效率,又使代码变更简洁优雅。
1.2 在日后的维护中由于业务逻辑代码与共有代码分开存放,而且共有代码是集中存放的,因此使维护工作变得简单轻松。

那到底应该怎么写呢? 请看我最终的代码,代码如下:

/**
* 跳转到待收货页面
*/
@CheckNet
public void jumpWaitReceiving() {
Intent intent = new Intent(this, WaitReceivingActivity.class);
startActivity(intent);
} /**
* 跳转到我的钱包页面
*/
@CheckNet
public void jumpMineWallet() {
Intent intent = new Intent(this, MineWalletActivity.class);
startActivity(intent);
}
上面这段代码,也没看到你省了多少代码。但其实在我们真正的开发过程中,远不止检测网络这么个功能,比如还需要检测登录,需要上传日志,统计用户行为等等。这样,我们方法越多省的代码就会越多,而且所有的代码都统一进行了管理,后面维护起来也方便,况且跟最开始比起来,代码的确也变得更加简洁了。那好吧,我们就只看到加了一个 CheckNet ,也没看到你判断网络的代码啊?别急,且接着往下看。最主要的其实还是下面这段代码:

 /**
* 处理网络检测切面
*/
@Aspect
public class SectionAspect { /**
* 找到处理的切点
* * *(..) 可以处理所有的方法
*/
@Pointcut("execution(@com.darren.architect_day02.CheckNet * *(..))")
public void checkNetBehavior() { } /**
* 处理切面
*/
@Around("checkNetBehavior()")
public Object checkNet(ProceedingJoinPoint joinPoint) throws Throwable {
Log.e("TAG", "checkNet");
// 做埋点 日志上传 权限检测(我写的,RxPermission , easyPermission) 网络检测
// 网络检测
// 1.获取 CheckNet 注解 NDK 图片压缩 C++ 调用Java 方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
CheckNet checkNet = signature.getMethod().getAnnotation(CheckNet.class);
if (checkNet != null) {
// 2.判断有没有网络 怎么样获取 context?
Object object = joinPoint.getThis();// View Activity Fragment ; getThis() 当前切点方法所在的类
Context context = getContext(object);
if (context != null) {
if (!isNetworkAvailable(context)) {
// 3.没有网络不要往下执行
Toast.makeText(context,"请检查您的网络",Toast.LENGTH_LONG).show();
return null;
}
}
}
return joinPoint.proceed();
} /**
* 通过对象获取上下文
*
* @param object
* @return
*/
private Context getContext(Object object) {
if (object instanceof Activity) {
return (Activity) object;
} else if (object instanceof Fragment) {
Fragment fragment = (Fragment) object;
return fragment.getActivity();
} else if (object instanceof View) {
View view = (View) object;
return view.getContext();
}
return null;
} /**
* 检查当前网络是否可用
*
* @return
*/
private static boolean isNetworkAvailable(Context context) {
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
// 获取NetworkInfo对象
NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo(); if (networkInfo != null && networkInfo.length > 0) {
for (int i = 0; i < networkInfo.length; i++) {
// 判断当前网络状态是否为连接状态
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
}

AOP编程 - 淘宝京东网络处理的更多相关文章

  1. 方便代理下单的EcStore收货地址一键分析插件,同时支持淘宝/京东/一号店

    使用EcStore开展分销的网站,代理需要经常代客下单,每个客户收货地址都不同,要选择和填写多个内容才能完成地址输入:省.市.区.详细地址.收货人姓名.手机电话等,非常麻烦,也容易输入错误.安装EcS ...

  2. iOS开发 仿淘宝,京东商品详情3D动画

    - (void)show { [[UIApplication sharedApplication].windows[0] addSubview:self.projectView]; CGRect fr ...

  3. 开源第三方登录组件OAuthLogin2.0 支持QQ,阿里巴巴,淘宝,京东,蘑菇街,有赞等平台

    Nuget地址:https://www.nuget.org/packages/OAuthLogin2.0/ 项目结构说明: AuthorizationProviders文件夹下主要存放内置的授权平台. ...

  4. 仿淘宝,京东红包雨(基于Phaser框架)

    本红包雨项目是基于HTML5的游戏框架Phaser写的,最终形成的是一个canvas,所以性能很好,但是必须要说的是这个框架比较大,压缩后也有700K左右,所以请慎用. 代码地址: https://g ...

  5. vue mint-ui 实现省市区街道4级联动(仿淘宝京东收货地址4级联动)

    demo及源码地址 https://github.com/artiely/citypicker 先去下载一个“省份.城市.区县.乡镇” 四级联动数据,然后 引入 import { Picker } f ...

  6. 解决safari里面淘宝京东页面无法打开以及打开后乱码的问题!

    sqlite3 ~/Library/Keychains/*/ocspcache.sqlite3 'DELETE FROM responses WHERE responderURI LIKE " ...

  7. js原生淘宝京东宝贝放大镜效果

    js实现商城放大镜效果 效果: 鼠标放上去会有半透明遮罩.右边会有大图片局部图. 鼠标移动时右边的大图片也会局部移动. 技术点: Event Event 是一个事件对象,当一个事件发生后,和当前事件发 ...

  8. 动态权限<二>之淘宝、京东、网易新闻 权限申请交互设计对比分析

    移动智能设备的快速普及,给生活带来巨大的精彩,但是智能设备上用户的信息数据很多,隐私数据也非常多,各种各样的app可能通过各种方式在悄悄的收集用户数据,而用户的隐私就变得耐人寻味了.比如之前的可以无限 ...

  9. 系统网站架构(淘宝、京东)& 架构师能力

    来一张看上去是淘宝的架构的图: 参考地址:http://hellojava.info/?p=520 说几点我认可的地方: 架构需要掌握的点: 通信连接方式:大量的连接通常会有两种方式: 1. 大量cl ...

随机推荐

  1. hao643.com劫持(修改快捷方式跳转至hao123.com)

    >症状:所有浏览器快捷方式,都被加上尾巴,例如IE的:"C:\Program Files\Internet Explorer\iexplore.exe" http://hao ...

  2. 一道JS面试题引发的血案

    刚入职新公司,属于公司萌新一枚,一天下午对着屏幕看代码架构时. BI项目组长给我看了一道面试别人的JS面试题. 虽然答对了,但把理由说错了,照样不及格. 话不多说,直接上题: var a = 1; s ...

  3. mybatis随笔二之SqlSessionFactory

    在上一篇文章我们已经得到了DefaultSqlSessionFactory @Override public SqlSession openSession() { return openSession ...

  4. javascript实现代码高亮-wangHighLighter.js

    1. 引言 (先贴出wangHighLighter.js的github地址:https://github.com/wangfupeng1988/wangHighLighter注意,程序和使用说明的更新 ...

  5. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的 ...

  6. Maven3路程(一)环境搭建

    好长时间不用Java,今天看了下,Maven集成成主流了,在技术水平与日俱进的同时,感叹下IT行业必须有活到老学到老的精神. 先说下环境: Maven:Maven 3.0.5 解压后路径:F:\Mav ...

  7. QT QPushButton

    #include<QApplication> #include<QWidget> #include<QPushButton> #include<QMenu&g ...

  8. Hibernate关联关系映射之一对多双向映射

    一对多映射有两种,一种是单向的,另一种的多向.我们一般是使用双向的,所以我就写写一对多的双向映射. 还是想昨天一样举个例子来说明:作者<===>作品,还是对数据进行增删改查. 我们一般是把 ...

  9. JVM学习记录-类加载器

    前言 JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类 ...

  10. Linux编辑启动停止重启springboot jar包脚本

    springboot的配置文件中,配置文件的名字都有各自的意义跟用途 dev 开发环境 prod 生产环境(默认) test 测试环境 加载指定配置文件 --spring.profiles.activ ...