单例模式-全局可用的 context 对象,这一篇就够了
2019-07-17 18:13
106 查看
单例模式在各个方面都有着极为广泛的使用,所谓单例,顾名思义就是整个程序中只有一个该类的实例,所以它成功保证了整个程序的生命周期内该类的对象只能创建一次,并且提供全局唯一访问该类的方法:getInstance()
使用
关于单例模式主要分为两类:
- 懒汉模式
- 饿汉模式
由于饿汉模式是线程安全的,所以通常情况下,我们都尽量采用饿汉模式,具体原因常见这位大佬的博文:点击前往
本文主要结合 Android 分析下当例模式在 Android 中获得全局可用的 Context 对象
搭建饿汉模式基本框架
单例模式基本方法包括
- 一个该类对象
- 该类构造方法
- 获得单例的方法
/**单例模式 * * 向整个应用提供 App (application) 单例 */ public class AppContext { private static AppContext instance; public AppContext(Context application){ } public static AppContext getInstance() { if (instance == null){ throw new RuntimeException(); } return instance; } }
对外暴露实例化单例的方法
外界调用时,将全局的 context 对象传入
public static void init(Context context){ if (instance != null){ throw new RuntimeException(); } instance = new AppContext(context); }
修改构造方法:
- 将全局的 Context 对象保存到该单例中
private Context applicationContext; public AppContext(Context application){ this.applicationContext = application; }
完整代码
在之前的基础上,暴露获得 Context 对象的方法
/**单例模式 * * 向整个应用提供 App (application) 单例 */ public class AppContext { private static AppContext instance; private Context applicationContext; public AppContext(Context application){ this.applicationContext = application; } public Context getApplicationContext() { return applicationContext; } public static AppContext getInstance() { if (instance == null){ throw new RuntimeException(); } return instance; } public static void init(Context context){ if (instance != null){ throw new RuntimeException(); } instance = new AppContext(context); } public static boolean isInitialized(){ return (instance != null); } }
单例的实例化
那么我们如何生成该单例能,由于单例是全剧唯一的,根据这个特性我们一般在 Application 中实例化它
public class App extends Application { @Override public void onCreate() { super.onCreate(); if (!AppContext.isInitialized()){ AppContext.init(getApplicationContext()); } } }
单例 context 的使用
context 的使用可以说非常广泛,例如获得程序网络功能,获得制定控件属性等等,用途可以说是非常广泛
- 获得网络状态
NetworkUtil.isNetworkAvailable(AppContext.getInstance().getApplicationContext() public class NetworkUtil { /** * 检查网络是否可用 * * @param context * @return */ public static boolean isNetworkAvailable(Context context) { ConnectivityManager manager = (ConnectivityManager) context .getApplicationContext().getSystemService( Context.CONNECTIVITY_SERVICE); if (manager == null) { return false; } NetworkInfo networkinfo = manager.getActiveNetworkInfo(); if (networkinfo == null || !networkinfo.isAvailable()) { return false; } return true; } }
- 在工具类中获得控件属性值
/** * color.xml里面的id */ public static int getColor(int colorResId){ Context context = OrderContext.getInstance().getApplicationContext(); return context.getResources().getColor(colorResId); }
单例模式的使用非常广泛,但具体的内容基本就这些,本文主要是我学习过程中的一点总结。
大家可以在此基础上加以改造使用,如果有其他的应用场景,欢迎在评论区中分享,一起进步~!
相关文章推荐
- 单例模式-全局可用的 context 对象,这一篇就够了
- 全局获取Context、Intent传递对象、日志类
- 严格模式下顶层箭头函数this指向的是全局对象
- 【看了一篇解释javascript中的上下文对象的,比较深刻】深入理解Javascript之执行上下文(Execution Context)
- Android编程实现全局获取Context及使用Intent传递对象的方法详解
- 21.手动创建Application,实现对某一对象的单例模式化,以及全局的context的设置
- 看这一篇就够了!浅谈ES6的Promise对象
- C和C++的面向对象专题(7)——单例模式解决静态成员对象和全局对象的构造顺序难题
- android全局获取Context对象(在静态函数中实现toast)
- J2EE表现层模式--context对象
- 获取全局Context对象,任何时候,任何地方,任何逻辑都可以获取
- node 核心内置类库1 EventEmitter和全局对象以及(事件机制和观察者模式的关系)
- android中为常用的Context对象 设置一个全局变量
- Android编程技巧之获取全局 Context 对象
- Activity 全屏,沉浸式模式这一篇就够了
- 全局获取Context的技巧,使用intent来传递对象
- Android 全局获取 Context 与使用 Intent 传递对象
- 可复用面向对象软件基础——设计模式(三)之抽象工厂模式
- 黑马程序员_Java基础_面向对象(Static的使用、对象初始化和调用成员过程、单例设计模式)
- Nodejs中的Global object全局对象