-
1.两次判断法:在getInstance()中先判断是否为null,不为null就不进入加锁区,进入加锁区之后再判断一次。
-
2.静态成员变量法:使用类的构造方法时初始化静态变量,创建唯一的静态实例
-
3.按需创建:使用内部类,在不调用getInstance()的情况下,不会加载内部类
-
4.枚举单例:以上的几个方式在反序列化的时候都会出现重新创建对象的问题,而枚举单例不会,其默认是线程安全的。、
-
5.例子:LayoutInflater用的就是单例,其是通过ContextImpl的getService()获得的,在该类被第一次加载的时候会使用HashMap注册各种Service用ServiceFetcher包裹,其中就包括LayoutInflater。
-
6.深入理解LayoutInflater:ServiceFetcher需要实现createService()返回具体的Service,LayoutInflater是通过PolicyManger的makeNewLayoutInflater()创建的,这个类是一个代理类,具体的实现在Policy中,在Policy中返回了一个PhoneLayoutInflater。这个类覆写了LayoutInflater的onCreateView(),为传入的View找到具体路径。rInflate()是解析xml最核心的方法:其通过深度优先遍历的方式来构建传入的xml文件中的视图树,每解析到一个View就递归调用rInflater(),直到这个路径下的最后一个元素然后再回溯将该View添加到parent中。
-
7.运用单例模式:在ImageLoader中使用该模式
-
8.优缺点:1.减少内存开支 2.减少性能开销 3.避免对一个西苑的多重占用 4.便于全局访问1.没有接口扩展困难 2.单例持有Context容易造成内存泄露,所以推荐使用Application的Context。