摘要:初始化配置友盟信鸽推送判断程序是否在前台的后处理器,利用编译期注解方式,指定线程和任务延时策略处理初始化的问题。
Application后处理器(AndroidPostProcessing): 通过注解配置初始化各模块及应用所需 sdk,按优先级/延时时间/是否只在Debug下有效/执行线程 等条件初始化 sdk
通常,我们要在 Application 中处理一堆的三方 SDK 和自定义框架的初始化,下面的处理方式会带来一些问题:
维护成本,应用启动慢、卡顿,实现方式 low 。
@Override public void onCreate() { super.onCreate(); mContext = getApplicationContext(); mHandler = new Handler(); // screen info registerScreenActionReceiver(); // UserCenterManager AccountManager.init(); // 初始化配置 ConfigManager.init(this); // token initToken(); // 友盟 MobclickAgent.init(); // Log LogUtils.init(BuildConfig.DEBUG); // ShareSdk ShareSDK.initSDK(mContext); // 信鸽推送 XGPushConfig.init(this); // Bugly if(!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 { @Override public void onCreate() { super.onCreate(); AndroidPostProcessing.initialization(this).dispatcher(); } @Override public 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
hotfix:
@App(name = "Hotfix", priority = 3) public class HotfixProxy implements IApp { @Override public 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 { @Override public 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 { @Override public 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
dispatcher 任务,WeakHandler + ScheduledThreadPool
SharePreference 缓存 优化性能
资源释放
感谢:)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71691.html
摘要:百分之百单元测试覆盖直面一剑封喉,基于实现框架常驻,依托生态实现业务常驻,此刻未来逐步渐进。国际化例子函数随机数字优化最开始采用的的继承一个基础的,方便单元测试有一定性能损失。 经过 1 个月的开发,QueryPHP v1.0.0-beta.1 版本可以发布了,这也是 beta 3 个版本的开始部分。这个版本的主要是代码解耦和性能提升,文档开发。 关于 QueryPHP QueryPH...
摘要:可维护解耦采用引入文件的方式取代在页面写代码避免在中创建大量当用于插入数据时,尽量不要直接插入标记。简化循环体循环体是执行最多的,所以要确保其被最大限地优化,确保没有某些可以被很容易移除循环的密集计算。 可维护 解耦HTML/JavaScript 1、采用引入js文件的方式取代在html页面写js代码2、避免在js中创建大量html (1)当js用于插入数据时,尽量不要直接插入标记。...
摘要:拓展模板方法模式回头看看上面责任链模式的代码,抽象类中定义了几个方法,一个是修饰的,一个是抽象方法,还有一个是。 前情提要 在实际开发中,我们常常会出现以下的代码情况: if (state == 1){ haveBreakfast(); } else if (state == 2){ haveLunch()...
阅读 1768·2021-11-23 09:51
阅读 1219·2021-11-18 10:02
阅读 951·2021-10-25 09:44
阅读 2081·2019-08-26 18:36
阅读 1602·2019-08-26 12:17
阅读 1132·2019-08-26 11:59
阅读 2729·2019-08-23 15:56
阅读 3319·2019-08-23 15:05