AOP编程 - 淘宝京东网络处理

现象描述

当我们打开京东 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 ,也没看到你判断网络的代码啊?别急,且接着往下看。最主要的其实还是下面这段代码:

 1 /**
 2  * 处理网络检测切面
 3  */
 4 @Aspect
 5 public class SectionAspect {
 6
 7     /**
 8      * 找到处理的切点
 9      * * *(..)  可以处理所有的方法
10      */
11     @Pointcut("execution(@com.darren.architect_day02.CheckNet * *(..))")
12     public void checkNetBehavior() {
13
14     }
15
16     /**
17      * 处理切面
18      */
19     @Around("checkNetBehavior()")
20     public Object checkNet(ProceedingJoinPoint joinPoint) throws Throwable {
21         Log.e("TAG", "checkNet");
22         // 做埋点  日志上传  权限检测(我写的,RxPermission , easyPermission) 网络检测
23         // 网络检测
24         // 1.获取 CheckNet 注解  NDK  图片压缩  C++ 调用Java 方法
25         MethodSignature signature = (MethodSignature) joinPoint.getSignature();
26         CheckNet checkNet = signature.getMethod().getAnnotation(CheckNet.class);
27         if (checkNet != null) {
28             // 2.判断有没有网络  怎么样获取 context?
29             Object object = joinPoint.getThis();// View Activity Fragment ; getThis() 当前切点方法所在的类
30             Context context = getContext(object);
31             if (context != null) {
32                 if (!isNetworkAvailable(context)) {
33                     // 3.没有网络不要往下执行
34                     Toast.makeText(context,"请检查您的网络",Toast.LENGTH_LONG).show();
35                     return null;
36                 }
37             }
38         }
39         return joinPoint.proceed();
40     }
41
42     /**
43      * 通过对象获取上下文
44      *
45      * @param object
46      * @return
47      */
48     private Context getContext(Object object) {
49         if (object instanceof Activity) {
50             return (Activity) object;
51         } else if (object instanceof Fragment) {
52             Fragment fragment = (Fragment) object;
53             return fragment.getActivity();
54         } else if (object instanceof View) {
55             View view = (View) object;
56             return view.getContext();
57         }
58         return null;
59     }
60
61     /**
62      * 检查当前网络是否可用
63      *
64      * @return
65      */
66     private static boolean isNetworkAvailable(Context context) {
67         // 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
68         ConnectivityManager connectivityManager = (ConnectivityManager)
69                 context.getSystemService(Context.CONNECTIVITY_SERVICE);
70         if (connectivityManager != null) {
71             // 获取NetworkInfo对象
72             NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
73
74             if (networkInfo != null && networkInfo.length > 0) {
75                 for (int i = 0; i < networkInfo.length; i++) {
76                     // 判断当前网络状态是否为连接状态
77                     if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) {
78                         return true;
79                     }
80                 }
81             }
82         }
83         return false;
84     }
85 }

原文地址:https://www.cnblogs.com/ganchuanpu/p/8351008.html

时间: 2024-08-29 12:47:18

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

Testin云测:从双11看淘宝京东暗战移动电商

Testin云测:从双11看淘宝京东暗战移动电商 2014/11/11 · Testin · 独家评测 一年一度的双11今天凌晨开战,这也是阿里巴巴集团上市后的首个双11,去年单日成交额350亿元的成绩,其中突破1亿元用了55秒,今年3分钟即突破10亿,1小时已突破122亿元."双11"释放惊人的购买力. 值得注意的是,今年双11期间,用户在移动端访问双十一会场的流量几乎达到PC端的两倍,而在往年这一数字只占20%左右,移动时代的双十一终于来了. 多项迹象显示,移动电商已逐渐成为电子商

Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情

Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情 先识别商品url,区分平台提取商品编号,再根据平台带着商品编号爬取数据. 1.导包 <!-- 爬虫相关Jar包依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.10-FINAL</version> </

通过云服务器实现淘宝京东抢拍器

马上就要双十一了,想在淘宝上帮女朋友抢一些礼物,网上下载了几个抢拍器,普遍都有问题,最终还是决定自己制作一个抢拍器.由于秒杀也受到网络和系统环境的影响,这里打算使用高速稳定点的云主机来协助实现.在云主机的选择上,必须是能直接连接主干网络的云主机,否则网络延迟和在家里上网区别不大.(开始以为阿里云秒杀会更快,但实际测试结果并不是这样.挑了几次后还是使用了常用的易迈云.大家可以根据自己的喜好来挑选.)本文在后面会附带具体操作方法.一, 秒杀的设计要求:a. 高稳定性,高网速b. 高频度模拟用户操作c

淘宝京东 单品界面翻页效果

今天写一个类似京东 / 淘宝商品详情的界面 原理: 第一级是一个scrollView, 第二级,同级放两个UITableView或UIScrollView(根据需求,whatever啦..),这里,第一页我用了一个UITableView,第二页放了一个UIScrollView,在滑动第一页tableView到底部或点击下一页button的时候,有一个bounce上拉,切换到下一页的效果,切回去同理.      这里会有手势冲突,滑动第二级视图的时候,父视图就无法滑动了,其实解决的办法很简单啦,U

淘宝京东双十一撸一撸

淘宝和京东双十一全自动撸一撸脚本 作者:乐乐 一.淘宝自动养猫猫脚本 (一).所需工具 Auto.js安装包(下载链接:https://www.lanzous.com/i70nqwd).淘宝APP (二).使用步骤 1.安装软件,给予权限 安装Auto.js APP,并打开一次软件,提示需要获取无障碍权限,跟着给予它权限 2.导入脚本 (1)点击Auto.js软件右下角的+号,选择文件 (2)给文件随便取一个名字,比如我叫taobao (3)把下面的代码粘贴进去,右上角点击保存 alert('准

android 仿淘宝京东购物车 ListView嵌套CheckBox

MyActivity===========================代码如下 package com.example.ListViewBoxDemo; import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.widget.CheckBox;import android.widget.CompoundB

淘宝-京东放大镜效果

效果 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>放大镜效果</title> 6 <style type="text/css"> 7 #div1 { 8 width: 180px; 9 height: 180px; 10 position: relative; 11 } 12 #div1

淘宝 京东等商城常用到的下拉菜单

HTML部分 <ul class="nav_right" id="nav"> <li><a href="#">我的金米仓<img src="images/arrow-1.png" style="width:10px;"></a> <ul> <li><a href="#">我的订单</a&

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

先去下载一个“省份.城市.区县.乡镇” 四级联动数据,然后 引入 import { Picker } from 'mint-ui'; //前提是npm install mint-ui -S Vue.component(Picker.name, Picker); 组件使用 <mt-picker :slots="addressSlots" class="picker" @change="onAddressChange" :visible-ite