摘要:初始化配置友盟信鴿推送判斷程序是否在前臺的后處理器,利用編譯期注解方式,指定線程和任務延時策略處理初始化的問題。
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 緩存 優化性能
資源釋放
感謝:)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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()...
閱讀 1808·2021-11-23 09:51
閱讀 1268·2021-11-18 10:02
閱讀 963·2021-10-25 09:44
閱讀 2099·2019-08-26 18:36
閱讀 1619·2019-08-26 12:17
閱讀 1146·2019-08-26 11:59
閱讀 2746·2019-08-23 15:56
閱讀 3350·2019-08-23 15:05