设计模式及在Android中的应用
来源:互联网 发布:cl.4z3.pw index.php 编辑:程序博客网 时间:2024/05/23 19:48
1. 首先了解一些单例模式的概念
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
这样做有以下几个优点
• 对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中;
• 保持程序运行的时候该中始终只有一个实例存在内存中
有如下经典的实现方式:
public class Singleton { private static volatile Singleton instance = null; private Singleton(){ } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; }}
以上实现由如下几个十分关键的地方:
• 必须要将构造函数私有化,以防止外部可以调用构造函数进行实例化;
• 定义一个静态函数获取该实例;
• 定义一个全局的静态变量,并以voliate修饰;
• 在实例获取函数中,必须进行同步处理,并在同步块中进行双重判空;(双重判空的原因:防止外部函数在调用该获取实例的函数时,恰好有一个线程被阻塞等待,等此次创建好实例之后,那个等待的线程获取锁之后就不需要再创建该实例,因此在同步锁内进行二次判空是有必要的)。
2. 单例模式在Android中的应用
回到Android中,是有很多地方用到了单例模式的,下面举例说明:
1).EventBus中获取实例:
private static volatile EventBus defaultInstance;public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { if (defaultInstance == null) { defaultInstance = new EventBus(); } } } return defaultInstance;}
该单例的实现就是标准的精简单例模式的实现;
2). InputMethodManager获取实例
static InputMethodManager sInstance;public static InputMethodManager getInstance() { synchronized (InputMethodManager.class) { if (sInstance == null) { IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE); IInputMethodManager service = IInputMethodManager.Stub.asInterface(b); sInstance = new InputMethodManager(service, Looper.getMainLooper()); } return sInstance; }}
在输入法服务实例的单例模式中,就是精简的模式,即将外部判空去除了,直接进入同步块中,当然同步块中的判空是必不可少的;
在Android中,诸如其他的系统服务如:AccessibilityManager在获取实例的时候就是采用的单例模式进行的。
3. 单例模式的自定义工具应用
应用单例模式,我们可以在创建自定义工具类来管理我们的Activity,代码示例如下:
public class ActivityManager { private static volatile ActivityManager instance; private Stack<Activity> mActivityStack = new Stack<Activity>(); private ActivityManager(){ } public static ActivityManager getInstance(){ if (instance == null) { synchronized (ActivityManager.class) { if (instance == null) { instance = new ActivityManager(); } } return instance; } public void addActicity(Activity act){ mActivityStack.push(act); } public void removeActivity(Activity act){ mActivityStack.remove(act); } public void killMyProcess(){ int nCount = mActivityStack.size(); for (int i = nCount - 1; i >= 0; i--) { Activity activity = mActivityStack.get(i); activity.finish(); } mActivityStack.clear(); android.os.Process.killProcess(android.os.Process.myPid()); }}
这个Activity的管理工具类就是一个十分典型的应用。注意,该Activity栈是归属于一个实例的,因此各个方法对该数据结构进行操作时,均是针对该实例所属的内存,因此所有的操作方法均为非静态。
最后,安利一个十分好用的Android framework源码查看网页:
androidxref.com,当前已更新到http://androidxref.com/7.1.1_r6/,完全免费,临时查阅很管用。
- 设计模式及在Android中的应用
- 设计模式及在Android中的应用
- 设计模式及在Java/Android中的应用
- 设计模式在Java/Android中的应用
- 设计模式在Android中的应用
- 命令模式及在Android中的应用
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- 浅学设计模式之模板<Template>方法模式及在android中的应用
- 浅学设计模式之组合<Composite>模式及在Android中的应用
- 浅学设计模式之建造者(Buildler Pattern)模式及在android中的应用
- 浅学设计模式之观察者<Observer>模式及在android中的应用 .
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- 浅学设计模式之建造者(Buildler Pattern)模式及在android中的应用
- 设计模式-职责链模式(chain of responsibility)及在Android中的应用
- android Java开发设计模式及在android中的应用解析
- 谈谈23种设计模式在Android源码及项目中的应用
- 设计模式在android中的应用——适配器模式
- 模拟XML文件信息的读取并创建实例
- 51单片机头文件reg51.h详解
- 小白书字母重排
- Objective-C排序算法实现
- c++作业6
- 设计模式及在Android中的应用
- C_Cpp-C-JNI-NDK-Java
- 算法提高 高精度乘法 ————大数乘法
- 基于Apache配置svn支持http访问
- Makefile知识点总结:
- 文章标题
- 利用POI生成简单报表
- 跟我一起写 Makefile-陈浩
- 欢迎使用CSDN-markdown编辑器