搭建项目框架

1. 明确模块分工

将项目按职能分工,划分不同的 Module ,比如

  • app 业务模块
  • annotations 注解模块
  • compiler 编译模块
  • core 核心模块
  • ec 其他模块

注意:这些模块要按照业务需要,依赖不同的库。如果需要使用标准 Java 中的一些类文件,则需要指定为 Java Library ,如果只需要使用 Android 中的类文件,则指定为 Android Library 。

2. 简化依赖关系

Module 与 Module 之间存在依赖明确的依赖关系,那么在 build.gradle 中的依赖声明能够简化的要简化。

比如, ec 依赖了 core ,那么 ec 中与 core 重复的依赖声明均可以删除掉。

3. 优化配置初始化参数

一般来说,配置参数都会在 Application 的子类的 onCreate() 方法中声明,但这种方法复杂且麻烦,下面介绍一种简单的方法。

新建一个类用于存储和管理所有的配置参数。所有的参数初始化只需要调用这个类暴露的接口方法即可达到目的。

这个类(Configurator)需要做到以下几点:

  • 返回 Configurator 实例(单例模式保证线程安全)
  • 使用 HashMap 以键-值的方式存储所有的配置参数,并提供 get 和 set 方法
  • 暴露初始化配置参数的方法
  • 暴露配置参数是否初始化完成的状态查询方法

代码示例如下(实际操作中将这个类拆成了三个类):

  • ConfigType.java

    package com.thorn.milk.app;
    
    /**
     * 1. enum 修饰的枚举类
     * 2. 特点:整个程序里面保证唯一的单例,只能被初始化一次,在进行多线程操作时使用,是一种多线程安全的懒汉模式
     */
    
    public enum ConfigType {
        API_HOST,
        APPLICATION_CONTEXT,
        CONFIG_READY,
        ICON
    }
    
  • Configurator.java

    package com.thorn.milk.app;
    
    import java.util.HashMap;
    
    /**
     * Created by pengj on 2018-7-13.
     * Github https://github.com/ThornFUN
     * Function:
     * 提醒:尽量让变量具有不可变性(使用 final 修饰),一个避免误修改,二个可以提升性能
     */
    public class Configurator {
    
        private static final HashMap<String, Object> MILK_CONFIGS = new HashMap<>();
    
        private Configurator() {
            MILK_CONFIGS.put(ConfigType.CONFIG_READY.name(), false);
        }
    
        /*
        * 1. 返回 Configurator 实例,使用懒汉模型的单例模式,静态内部类方式实现
        * */
        private static class Holder {
            private static final Configurator INSTANCE = new Configurator();
        }
    
        public static Configurator getInstance() {
            return Holder.INSTANCE;
        }
    
        /*
        * 2. 返回存储 Configurations 的 Map 实例,
        * */
        public static HashMap<String, Object> getMilkConfigs() {
            return MILK_CONFIGS;
        }
    
        /*
        * 3. 暴露外部调用的方法,以作初始化记录
        * */
        public final void configure() {
            MILK_CONFIGS.put(ConfigType.CONFIG_READY.name(), true);
        }
    
        /*
        * 4. 传入 ApiHost 初始化数据
        * */
        public final Configurator withApiHost(String host) {
            MILK_CONFIGS.put(ConfigType.API_HOST.name(), host);
            return this;//将原对象添加属性后,重新赋值回去
        }
    
        /*
        * 5. 从 Map 中获取指定 ConfigType 的 Object 的值
        * */
        @SuppressWarnings("unchecked")
        final <T> T getConfigurations(Enum<ConfigType> key) {
            checkConfigration();
            return (T) MILK_CONFIGS.get(key);
        }
    
        public final void checkConfigration() {
            final boolean isReady = (boolean) MILK_CONFIGS.get(ConfigType.CONFIG_READY.name());
            if (!isReady) {
                throw new RuntimeException("Config is not ready,call configure");
            }
        }
    }
    
  • Milk.java

    package com.thorn.milk.app;
    
    import android.content.Context;
    import java.util.HashMap;
    
    /**
     * Created by pengj on 2018-7-13.
     * Github https://github.com/ThornFUN
     * Function:
     */
    
    public final class Milk {
        public static Configurator init(Context context){
            getConfigurations().put(ConfigType.APPLICATION_CONTEXT.name(),context.getApplicationContext());
            return Configurator.getInstance();
        }
    
        private static HashMap<String,Object> getConfigurations(){
            return Configurator.getInstance().getMilkConfigs();
        }
    }
    
  • 那么 Application 中调用如下:

    public class FastECApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            Milk.init(getApplicationContext())
                    .withApiHost("这里写服务器地址")
                    .configure();
        }
    }
    

猜你喜欢

转载自blog.csdn.net/baidu_33221362/article/details/81033477
今日推荐