博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AndroidApplication优化解耦
阅读量:6979 次
发布时间:2019-06-27

本文共 3955 字,大约阅读时间需要 13 分钟。

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
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 {    @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 接口对应的对象可以单独 出执行时间
③ 关于 async ,默认主线程,如果为true则运行在子线程,线程优先级为 background

eg:

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:

③ 的api

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

感谢:)

转载地址:http://lqjpl.baihongyu.com/

你可能感兴趣的文章
leetCode 338. Counting Bits | Dynamic Programming | Medium
查看>>
Linux系统下的RZSZ(文件传输工具)
查看>>
创建 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(76)
查看>>
PostgreSQL中1000分区的继承分区表更新失败的原因
查看>>
快照对于云计算是鸡肋吗?
查看>>
PostgreSQL中如何对应SQL Server中的rowversion
查看>>
第5章选择结构程序设计
查看>>
linux 下网络流量监控
查看>>
[CentOS6] Page allcation failure
查看>>
Visual Studio 11 九大新特性:图文详解
查看>>
Linux Shell之六 流程控制--循环
查看>>
寻湖北荆州刘氏族谱
查看>>
Oracle数据库的DBID变更
查看>>
MagicLinux+MySQL5+PHP5+Apache2+phpMyAdmin
查看>>
服务器RAID磁盘坏道修复实战
查看>>
SOAP
查看>>
Sql Server 2005 基于通知的缓存失效
查看>>
理解Windows中的路由表和默认网关
查看>>
.NET多线程编程(13)——一个简单的C#多线程间同步的例子
查看>>
mysql数据导入中文乱码的解决办法
查看>>