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

1,164 阅读3分钟

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

自我介绍

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

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

AppGlobal的介绍

1. AppGlobal的设计初衷

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

  • 请记住这两点初衷: 一是常用、二是方便

2. AppGlobal的初始化:

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

 AppGlobal.init(context)
          .configure()

3. AppGlobal的使用场景:

  • 下面举个栗子:
    • 我们实际项目中经常用到的一个场景呢,就是线程的切换,例如假设我们当前实在一个子线程环境中,我们需要切换到主线程,对UI进行操作,那么就可以使用下面的代码,通过AppGlobal.getHandler()获取到全局共用的Handler对象来进行切换到主线程:
new Thread(new Runnable() {
            @Override
            public void run() {
                // 假设当前是子线程环境
                AppGlobal.getHandler().post(new Runnable() {
                    @Override
                    public void run() {
                        // 当前是主线程环境了,可以操作UI了

                    }
                });
            }
        }).start();
  • 再来一个栗子:

    我们APP设计UI风格的时候,会定一个主题颜色,那么这个主题颜色我们就可以通过AppGlobal保存起来,并且在需要用到的地方,可以通过AppGlobal取出来使用:

    • 存储主题颜色:

      AppGlobal.init(this)
        .withThemeColor(Color.parseColor("#FF0000"))// 存储主题颜色
        .configure();
      
    • 获取主题颜色:

      int themeColor = AppGlobal.getConfiguration(ConfigType.THEME_COLOR);
      

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桂』,欢迎关注