Application后处理器(AndroidPostProcessing): 通过注解配置初始化各模块及应用所需 sdk,按优先级/延时时间/是否只在Debug下有效/执行线程 等条件初始化 sdk

通常,我们要在 Application 中处理一堆的三方 SDK 和自定义框架的初始化,下面的处理方式会带来一些问题:
维护成本,应用启动慢、卡顿,实现方式 low 。

    @Overridepublic void onCreate() {super.onCreate();mContext = getApplicationContext();mHandler = new Handler();// screen inforegisterScreenActionReceiver();// UserCenterManagerAccountManager.init();// 初始化配置ConfigManager.init(this);// tokeninitToken();// 友盟MobclickAgent.init();// LogLogUtils.init(BuildConfig.DEBUG);// ShareSdkShareSDK.initSDK(mContext);// 信鸽推送XGPushConfig.init(this);// Buglyif(!BuildConfig.DEBUG){initBugly();}// 判断程序是否在前台registerActivityLifecycleCallbacks(this);}

AndroidPostProcessing

Application 的后处理器,利用编译期注解方式,指定线程和任务延时策略处理初始化的问题。
项目地址 和 demo

使用方式:

引入AndroidPostProcessing和注解处理器,已经上传maven :)
project/build.gradle

allprojects {repositories {...maven {url  "https://dl.bintray.com/woaigmz/AndroidPostProcessing"}}
}

common-lib 模块:

    api 'com.woaigmz.app:postprocessing:0.0.1'api 'com.woaigmz.app:postprocessing-annotation:0.0.1'//如果 common 模块需要用 @App 注解annotationProcessor 'com.woaigmz.app:postprocessing-compiler:0.0.1'

其他子模块:

    implementation project(':common')annotationProcessor 'com.woaigmz.app:postprocessing-compiler:0.0.1'

1:Application:

public class App extends Application {@Overridepublic void onCreate() {super.onCreate();AndroidPostProcessing.initialization(this).dispatcher();}@Overridepublic void onTerminate() {super.onTerminate();AndroidPostProcessing.release();}
}

2:各处理模块:
① 代理类实现 IApp 接口,类名随意;
② 类头部加 @App() 注解

@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface App {boolean RELEASE = false;boolean DEBUG = true;String name() default "Main";      //名称boolean type() default RELEASE;    //release起作用还是debug时起作用int priority() default 0;   //优先级 - 执行顺序boolean async() default false;    //是否异步,默认同步,在主线程执行long delay() default 0;    //延时时间,默认为0,不延时执行
}
注意:

① 关于多进程:每个进程都会 onCreate() onTerminate() ,初始化时的任务表,所以互不影响,资源释放也不受影响。该库默认所有进程都存在,如果要有主进程库,可以 onCreate 添加判断条件
② 关于调试: ctrl + shif t + F ,全局搜索 @App ,每个 IApp 接口对应的对象可以单独 hugo 出执行时间
③ 关于 async ,默认主线程,如果为true则运行在子线程,线程优先级为 background

eg:

hotfix:

@App(name = "Hotfix", priority = 3)
public class HotfixProxy implements IApp {@Overridepublic void dispatcher(@NonNull Application application) {Toast.makeText(application, "Hotfix", Toast.LENGTH_SHORT).show();}
}

cache:

@App(name = "Cache", priority = 2, async = true, delay = 2000)
public class CacheProxy implements IApp {@Overridepublic void dispatcher(@NonNull Application application) {Looper.prepare();Toast.makeText(application, "cache", Toast.LENGTH_SHORT).show();Looper.loop();}
}

leakcanary:

@App(name = "LeakCanary", type = App.DEBUG, priority = 1, delay = 5000)
public class LeakCanaryProxy implements IApp {@Overridepublic void dispatcher(@NonNull Application application) {Toast.makeText(application, "LeakCanary", Toast.LENGTH_SHORT).show();}
}

实现思路:

① 注解部分:编译生成的中间代理类,都在 com.woaiqw.generate 包下

package com.woaiqw.generate;/**
* Generated code from AndroidPostProcessing . Do not modify!*/public final class LeakCanary$$Proxy{public static final String path = "com.woaiqw.common.LeakCanaryProxy";public static final String name = "LeakCanary";public static final boolean type = true;public static final int priority = 1;public static final boolean async = false;public static final long delay = 5000;}

② 注解处理器AbstractProcessor:
AppProcessor

③ AndroidPostProcessing 的api
初始化注解生成的代理类,按 priority 生成代理列表List<AppDelegate>
dispatcher 任务,WeakHandler + ScheduledThreadPool
SharePreference 缓存 优化性能
资源释放

感谢:)

AndroidApplication优化解耦相关推荐

  1. 企业级Nginx服务基础到架构优化详解--25条

    1.隐藏nginx header版本号 2.更改源码隐藏软件名称 3.更改nginx默认用户及用户组 4.配置nginx worker进程个数 5.根据CPU核数进行nginx进程优化 6.nginx ...

  2. 深度粗排模型的GMV优化实践:基于全空间-子空间联合建模的蒸馏校准模型

    随着业务的不断发展,粗排模型在整个系统链路中变得越来越重要,能够显著提升线上效果.本文是对粗排模型优化的阶段性总结. 背景 在搜索.推荐.广告等大规模信息检索场景中,通常会将检索分为召回.粗排.精排三 ...

  3. 论文学习:Decoupling Value and Policy for Generalization in Reinforcement Learning(强化学习中泛化的解耦价值和策略)

    摘要: Standard deep reinforcement learning algorithms use a shared representation for the policy and v ...

  4. 对装饰器@wraps的解释(一看就懂)-- 并对装饰器详解

    1. 先看一段代码 def is_login(func):def foo(*args,**kwargs):return func(*args,**kwargs)return foodef test() ...

  5. AutoML综述更新 【AutoML:Survey of the State-of-the-Art】

    论文: AutoML: Survey of the State-of-the-Art 下面这个网站会不断更新AutoML相关的论文,当然如果你的论文未被收录,你也可以手动上传你的论文让更多人看到(建议 ...

  6. Android EventBus使用与思路总结

    首先说说为什么要用它: 平常开发中免不了要进行各种aci或frgm之间的通信,其实aci之间相对还好,必竟可以通过intent方式,也不会觉得耦合性太强,但frgm之间就麻烦了,除了设置各种接口lis ...

  7. SDCC 2015架构专场札记:一线互联网公司的架构实践

    SDCC 2015架构专场札记:一线互联网公司的架构实践 发表于8小时前| 835次阅读| 来源CSDN| 1 条评论| 作者么刚 SDCC架构数据库互联网性能优化架构师 width="22 ...

  8. 京东到家大数据平台架构演进实战

    达达-京东到家大数据平台是根据公司业务持续快速成长,而规划建设的一个可持续发展的平台.在建设过程中我们借鉴了很多公司实施大数据平台的经验,并因地制宜构建了我们自己的实施策略,确保在大方向上不会走偏,并 ...

  9. Authing 背后的计算哲学

    Authing 是一个严肃的.以开发者为中心的身份云平台,这个平台由一群严肃的人精心设计并经过 2 次重构后才成功推向了市场.通过知识型内容营销和口碑传播,Authing 已经吸引 1 万多名开发者和 ...

最新文章

  1. 谷歌创造ImageNet1K新纪录:性能不佳的微调模型不要扔,求一下平均权重就能提升性能...
  2. bzoj2424 订货
  3. Android小结(1)
  4. jsoncpp和rapidjson哪个好用?
  5. php 去掉数组中的空值_PHP删除数组中空值的方法介绍
  6. hibernate框架之主键生成
  7. docker 安装elasticsearch
  8. 【HTML/CSS】浮动模型和清除浮动的方法
  9. ssm read time out的原因_加盟蜜雪冰城未通过是什么原因?总部公布了两点原因
  10. 最全的iOS物理引擎demo
  11. arcmap新手教程_ArcGIS入门教程来袭,零基础的同学快看过来!
  12. ArcGIS操作实例视频教程38讲全集(转)
  13. ireport实现金额小写转大写
  14. [原创] 适合新手的转手绘教程[ JJ ]
  15. 模拟双色球系统判断中奖情况
  16. NeHe OpenGL系列教程(中英文版附带VC++源码)中英文系列
  17. 知网CAJ转PDF(硕博论文带书签)
  18. 数值越界mysql_Mysql数据读取越界问题
  19. 个人软件开发常用网站
  20. 好记性不如烂笔头之 App widgets(一)

热门文章

  1. MacBook如何用Parallels Desktop安装windows7/8
  2. C++标准库中各种排序归纳
  3. [转] ASP.NET MVC3 路由和多数据集的返回
  4. kaldi 源码分析(十) - gmm-init-mono.c分析
  5. springboot之定时任务
  6. java与c/c++之间的数据交互-----jni点滴
  7. 【Win10 应用开发】语音命令与App Service集成
  8. git ssh key创建和github使用
  9. Java语言的基础知识9
  10. Oracle VM VirtualBox安裝Windows 2000失败