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
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:
AppProcessor
③ AndroidPostProcessing 的api
初始化註解生成的代理類,按 priority 生成代理列表List
dispatcher 任務,WeakHandler + ScheduledThreadPool
SharePreference 緩存 優化性能
資源釋放
感謝:)