安卓核心代码库

(一) 安卓通用代码库 之 AppGlobal

2020-12-23  本文已影响0人  G桂

通用核心代码库-code: 适合入门不久的同学学习借鉴编程思想,也可以直接拿来使用。

自我介绍

我是android开发阿桂,接下来我会分享从业几年以来积累的、最常用的封装类和基础框架等等,我把它们封装成了一个通用核心代码库code,几乎每个项目都可以引入它,实现快速开发。接下来的文章我会以一个系列的形式逐渐介绍它。

想要源码git地址的同学赏个赞呗,它是一个Module,大家可以自行下载依赖。

AppGlobal的介绍

1. AppGlobal的设计初衷

AppGlobal的设计初衷:就是为了在任何位置的代码都可以方便地获取到一些常用的配置信息或对象。

2. AppGlobal的初始化:

一般是在Application类的onCreate方法里面进行初始化

 AppGlobal.init(context)
          .configure()

3. AppGlobal的使用场景:

new Thread(new Runnable() {
            @Override
            public void run() {
                // 假设当前是子线程环境
                AppGlobal.getHandler().post(new Runnable() {
                    @Override
                    public void run() {
                        // 当前是主线程环境了,可以操作UI了

                    }
                });
            }
        }).start();

4. 代码实现细节

我们回到AppGlobal的初始化代码这里,在调用AppGlobal的init方法时,里面会去调用getConfigurator方法,获取到一个Configurator对象。

public class AppGlobal {
    private static Configurator getConfigurator() {
        return Configurator.getInstance();
    }

    public static Configurator init(Context context) {
        return getConfigurator().withApplicationContext(context.getApplicationContext());
    }
    
    ...
}

我们再进去看下Configurator类的实现,进来后,很明显的看出,Configurator类是采用单例模式的设计,而它的构造方法里呢,会把Handler对象放到一个静态Map集合里,我们用到Handler对象的时候呢,其实就是从这个Map对象里拿的,还有其他全局对象,也都是放在这个Map集合里供使用。

public class Configurator {
    private static final String TAG = "Configurator";
    /**
     * 存储Handler、ApiHost、ApplicationContext等全局通用信息。<br>
     * 特别提醒:不适合存放太多东西,最好只存放常用的、内存小的对象,不适合放大对象。
     */
    private static final Map<Enum<ConfigType>, Object> CONFIGS = new HashMap<>();
    /**
     * 全局Handler
     */
    private static final Handler HANDLER = new Handler();

    private static class Holder {
        private static final Configurator INSTANCE = new Configurator();
    }

    public static Configurator getInstance() {
        return Holder.INSTANCE;
    }

    private Configurator() {
        CONFIGS.put(ConfigType.CONFIG_READY, false);
        CONFIGS.put(ConfigType.HANDLER, HANDLER);
    }
  
    public <T> T getConfiguration(Enum<ConfigType> configType) {
        checkConfiguration();
        return (T) CONFIGS.get(configType);
    }

    public Configurator configure() {
        CONFIGS.put(ConfigType.CONFIG_READY, true);
        // 初始化logger
        Logger.addLogAdapter(new AndroidLogAdapter());
        return this;
    }

    Configurator withApplicationContext(Context context) {
        CONFIGS.put(ConfigType.APPLICATION_CONTEXT, context.getApplicationContext());
        return this;
    }

    public Configurator withApiHost(String apiHost) {
        Log.d(TAG, "apiHost: ");
        CONFIGS.put(ConfigType.API_HOST, apiHost);
        return this;
    }
  
    ......
}

5. 特别注意一点

Configurator里面的Map不适合存放太多东西,最好只存放常用的、内存小的对象,不适合放大对象。

因为它基本是和APP的生命周期一致,所有对象会一直占用着内存。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
觉得有用同学,点赞鼓励下呗。 个人公众号『Grade桂』,欢迎关注

上一篇 下一篇

猜你喜欢

热点阅读