一、项目架构初始化

1、我们的应用只有一个activity,它里面是多个fragment进行切换的,这样的好处是应用会非常顺滑,并且一个activity也可以进行很多全局的处理。

在类前加上final字段,说明不允许继承和修改该类。应用一般的做法是创建一个类,继承Application,在onCreate()方法中进行初始化,然后在application属性中将name属性标上,这是通常的一个做法,但是这种做法很烦,需要写很多地方。那么应该如何做呢?我们可以把一些全局信息存储在一个map里面,包括applicationContext,然后在任何引用了这个库的业务逻辑的module里面,都可以直接去使用它。

 

2、Latte:

是一个工具类,里面都是一些静态方法。

 

3、Configurator:

进行一些配置文件的存储,以及获取的。

这里使用的是static final的一个类,这样在全局初始化的时候就会进行初始化。这里使用的是WeakHashMap,它里面保存的键值对,在不使用的时候就会进行回收,而且非常及时。也就是说它可以最大限度地避免内存爆满,它比hashmap要好很多,特别是在存储大量东西的时候。我们存储的对象可能是一个字符串、可能是一个int值,可能是一个对象,这个时候就使用object进行存储,这样灵活性就比较高了。

configure():告诉我们配置已经配置好了。

电商应用组件化架构设计 电商app架构_懒汉模式

 

单例创建配置对象,这是一个非常安全的线程单例懒汉模式

电商应用组件化架构设计 电商app架构_懒汉模式_02

 

withApiHost():配置Api Host

checkConfiguration():检查配置是否完成。在写类变量或者方法变量的时候,尽量让它的变量不可变性达到最大化。什么叫做不可变量最大化呢?比如final关键字。就是说这个变量在以后的程序开发中不会再去修改它了,就用final去修饰。用final修饰呢,可以很大程度上减少本不该更改的变量。jvm虚拟机也可以对一些final和final修饰的public final修饰的一些关键字进行优化。或多或少都会有一些性能的提升。其实在方法上不加final也是可以的,个人推荐还是加上。这个方法是在什么时候调用呢?当然是在程序中需要获取这个方法的时候调用。如果没有使用这个configure()方法的时候,就会抛出这个异常,来保证我们配置的完整性和健壮性。

电商应用组件化架构设计 电商app架构_电商应用组件化架构设计_03

 

 

getConfiguration(Enum<ConfigType>key):参数是枚举类型,泛型是ConfigType,上面的注解是告诉编译器,上面那个类型我是没有检测过的,但是并不抛出警告。当然不加这个注解也是可以的,但是会有一个黄色的东东

电商应用组件化架构设计 电商app架构_电商应用组件化架构设计_04

 

调用方式,在唯一的activity入口或者application的onCreate()方法中调用

电商应用组件化架构设计 电商app架构_初始化_05

 

如果想要加入其它配置的话,只要调用相应的方法就可以

电商应用组件化架构设计 电商app架构_初始化_06

 

注:编写代码的一个规范,不管是java开发还是Android开发,static final类在声明的时候,名字需要大写,并且需要下划线来分割,这是一个良好的习惯。

关于单例模式,如果要使用懒汉模式的话,要不然就使用双重校验锁,也就是syncronized关键字来防止它的线程冲突,因为在正常情况下,用懒汉模式写的一般都是有问题的。要么就是用枚举类来进行统一的初始化。或者一种比较优雅的方式,就是静态内部类的初始化。

 

 

4、枚举类ConfigType

API_HOST:用来配置网络请求的域名

APPLICATION_CONTEXT:整个应用的上下文

CONFIG_READY:初始化或者配置完成了没有

ICON:用来配置我们自己的一些初始化项目

电商应用组件化架构设计 电商app架构_懒汉模式_07

 

 

5、Latte:

当调用latte的init()方法时,其实就是将配置项传入到Configurator里面进行一些相应的配置

电商应用组件化架构设计 电商app架构_枚举类_08

 

 

枚举类在整个应用程序中,是唯一的一个单例,并且它只能被初始化一次。也就是说在使用多线程的时候,完全可以使用枚举类来进行一个惰性的单例初始化。也就是通俗说线程安全的懒汉模式。