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

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

Android小彩虹2021-08-15 15:49:27270A+A-

通用核心代码库-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桂』,欢迎关注

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们