AndroidApplication优化解耦

news/2024/7/2 23:40:24

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
postprocessing.gif

使用方式:

引入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 缓存 优化性能
资源释放

感谢:)


http://lihuaxi.xjx100.cn/news/245852.html

相关文章

android monkey原理_Monkey与Appium的使用

monkey与monkeyrunner不足之处&#xff1a;元素定位依赖于坐标点&#xff0c;稳定性差不支持跨平台使用&#xff08;iOS平台无法使用&#xff09;没有成熟系统的管理框架只适用于冒烟测试&#xff0c;检测app稳定性。Appium是一个开源测试自动化框架&#xff0c;可用于…

hibernate4中取得connection的方法

在hibernate3中&#xff0c;使用了c3p0连接池&#xff0c;尝试了多种办法取得connection对象&#xff0c;以下两种可以使用。 Java代码 Connection conn; // 方法1&#xff1a;hibernate4中将要废弃这个方法 conn session.connection(); // 方法2&#xff1a;这个方法也可…

(转)I 帧和 IDR 帧的区别

I 帧和 IDR 帧的区别&#xff1a;http://blog.csdn.net/skygray/article/details/6223358 IDR 帧属于 I 帧。解码器收到 IDR frame 时&#xff0c;将所有的参考帧队列丢弃 &#xff08;用x264_reference_reset 函数实现——在 encoder.c 文件中&#xff09; 。这点是所有 I 帧…

Hulu直播服务难点解析(一):系统需求

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/83053654 Hulu在其博客发布了建立直播服务遇到的挑战及解决方案&#xff0c;这对于以前只提供点播服务的系统而言是一次彻底的升级。Li…

JDK动态代理和Cglib的动态代理

2019独角兽企业重金招聘Python工程师标准>>> 最简单的是静态代理方法&#xff0c;即代理模式&#xff0c;这里就不多啰嗦了。。 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的&#xff0c;需要被代理的类需要有接口&#xff0c;否则无法实现 package proxy…

滚动屏幕显示隐藏div_HTML结构-常用标签:a·img·table·form·input·iframe·div

学习目标&#xff1a;掌握html的结构,head与body的区别 掌握常用标签 掌握a标签,img标签 掌握table标签 掌握form标签,input标签 掌握iframe 和frameSet标签 掌握div标签互联网的三大基石互联网中的三大基石是什么?HTML:超文本标记语言 HTTP:超文本传输协议 URL:统一资源定位符…

如何更快速加载你的JS页面

确保代码尽量简洁 不要什么都依赖JavaScript。不要编写重复性的脚本。要把JavaScript当作糖果工具&#xff0c;只是起到美化作用。别给你的网站添加大量的JavaScript代码。只有必要的时候用一下。只有确实能改善用户体验的时候用一下。 尽量减少DOM访问 使用JavaScript访问DOM元…

Android APP全面屏适配技术要点

全面屏的概念 为什么先要解释一下全面屏&#xff0c;因为这个词在现在来讲就是一个伪命题。全面屏字面意思就是手机的正面全部都是屏幕&#xff0c;100%的屏占比。但是现在推出所谓“全面屏”手机的厂商没有一个能达到全面的。 那么下面来说一下Android开发领域对全面屏的理解和…