成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

AndroidApplication優(yōu)化解耦

wuyangnju / 3615人閱讀

摘要:初始化配置友盟信鴿推送判斷程序是否在前臺(tái)的后處理器,利用編譯期注解方式,指定線(xiàn)程和任務(wù)延時(shí)策略處理初始化的問(wèn)題。

Application后處理器(AndroidPostProcessing): 通過(guò)注解配置初始化各模塊及應(yīng)用所需 sdk,按優(yōu)先級(jí)/延時(shí)時(shí)間/是否只在Debug下有效/執(zhí)行線(xiàn)程 等條件初始化 sdk

通常,我們要在 Application 中處理一堆的三方 SDK 和自定義框架的初始化,下面的處理方式會(huì)帶來(lái)一些問(wèn)題:
維護(hù)成本,應(yīng)用啟動(dòng)慢、卡頓,實(shí)現(xiàn)方式 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();
        }
        // 判斷程序是否在前臺(tái)
        registerActivityLifecycleCallbacks(this);

    }
AndroidPostProcessing

Application 的后處理器,利用編譯期注解方式,指定線(xiàn)程和任務(wù)延時(shí)策略處理初始化的問(wèn)題。
項(xiàng)目地址 和 demo

使用方式:

引入AndroidPostProcessing和注解處理器,已經(jīng)上傳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:各處理模塊:
① 代理類(lèi)實(shí)現(xiàn) IApp 接口,類(lèi)名隨意;
② 類(lèi)頭部加 @App() 注解

@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface App {
    boolean RELEASE = false;
    boolean DEBUG = true;
    String name() default "Main";      //名稱(chēng)
    boolean type() default RELEASE;    //release起作用還是debug時(shí)起作用
    int priority() default 0;   //優(yōu)先級(jí) - 執(zhí)行順序
    boolean async() default false;    //是否異步,默認(rèn)同步,在主線(xiàn)程執(zhí)行
    long delay() default 0;    //延時(shí)時(shí)間,默認(rèn)為0,不延時(shí)執(zhí)行
}
注意:

① 關(guān)于多進(jìn)程:每個(gè)進(jìn)程都會(huì) onCreate() onTerminate() ,初始化時(shí)的任務(wù)表,所以互不影響,資源釋放也不受影響。該庫(kù)默認(rèn)所有進(jìn)程都存在,如果要有主進(jìn)程庫(kù),可以 onCreate 添加判斷條件
② 關(guān)于調(diào)試: ctrl + shif t + F ,全局搜索 @App ,每個(gè) IApp 接口對(duì)應(yīng)的對(duì)象可以多帶帶 hugo 出執(zhí)行時(shí)間
③ 關(guān)于 async ,默認(rèn)主線(xiàn)程,如果為true則運(yùn)行在子線(xiàn)程,線(xiàn)程優(yōu)先級(jí)為 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();
    }
}
實(shí)現(xiàn)思路:

① 注解部分:編譯生成的中間代理類(lèi),都在 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
初始化注解生成的代理類(lèi),按 priority 生成代理列表List
dispatcher 任務(wù),WeakHandler + ScheduledThreadPool
SharePreference 緩存 優(yōu)化性能
資源釋放

感謝:)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71691.html

相關(guān)文章

  • QueryPHP V1-beta.1 部分文檔代碼解耦,版本PHP 7.3.2

    摘要:百分之百單元測(cè)試覆蓋直面一劍封喉,基于實(shí)現(xiàn)框架常駐,依托生態(tài)實(shí)現(xiàn)業(yè)務(wù)常駐,此刻未來(lái)逐步漸進(jìn)。國(guó)際化例子函數(shù)隨機(jī)數(shù)字優(yōu)化最開(kāi)始采用的的繼承一個(gè)基礎(chǔ)的,方便單元測(cè)試有一定性能損失。 經(jīng)過(guò) 1 個(gè)月的開(kāi)發(fā),QueryPHP v1.0.0-beta.1 版本可以發(fā)布了,這也是 beta 3 個(gè)版本的開(kāi)始部分。這個(gè)版本的主要是代碼解耦和性能提升,文檔開(kāi)發(fā)。 關(guān)于 QueryPHP QueryPH...

    lentrue 評(píng)論0 收藏0
  • js編寫(xiě)的可維護(hù)與性能優(yōu)化

    摘要:可維護(hù)解耦采用引入文件的方式取代在頁(yè)面寫(xiě)代碼避免在中創(chuàng)建大量當(dāng)用于插入數(shù)據(jù)時(shí),盡量不要直接插入標(biāo)記。簡(jiǎn)化循環(huán)體循環(huán)體是執(zhí)行最多的,所以要確保其被最大限地優(yōu)化,確保沒(méi)有某些可以被很容易移除循環(huán)的密集計(jì)算。 可維護(hù) 解耦HTML/JavaScript 1、采用引入js文件的方式取代在html頁(yè)面寫(xiě)js代碼2、避免在js中創(chuàng)建大量html (1)當(dāng)js用于插入數(shù)據(jù)時(shí),盡量不要直接插入標(biāo)記。...

    YFan 評(píng)論0 收藏0
  • 從實(shí)踐學(xué)習(xí)設(shè)計(jì)模式——優(yōu)化多if代碼結(jié)構(gòu)

    摘要:拓展模板方法模式回頭看看上面責(zé)任鏈模式的代碼,抽象類(lèi)中定義了幾個(gè)方法,一個(gè)是修飾的,一個(gè)是抽象方法,還有一個(gè)是。 前情提要 在實(shí)際開(kāi)發(fā)中,我們常常會(huì)出現(xiàn)以下的代碼情況: if (state == 1){ haveBreakfast(); } else if (state == 2){ haveLunch()...

    馬永翠 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<