单例模式-全局可用的 context 对象,这一篇就够了
单例模式在各个方面都有着极为广泛的使用,所谓单例,顾名思义就是整个程序中只有一个该类的实例,所以它成功保证了整个程序的生命周期内该类的对象只能创建一次,并且提供全局唯一访问该类的方法: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 对象,这一篇就够了的更多相关文章
- mycat高可用-安全管理-监控 看这一篇就够了
在之前的操作中,我们已经实现了mysql机器的高可用,可以动态切换master,那么如果mycat崩溃了呢?我们应该如何处理呢?所以此时就需要搭建mycat的高可用集群了. 在mycat的权威 ...
- Context对象还提供了相应的属性来调整线条及填充风格
创建一个Canvas画布的方法如下: 复制代码 代码如下: <canvas id=”canvas” width=”600” height=”400”></canvas> 可以在 ...
- Android 内核--Context对象
Context(在Android中翻译为场景):一个Activity就是一个Context,一个Service也是一个Context,应用程序中有多少个Activity或者Service,就会有多少个 ...
- 量化交易之下单函数和context对象
一.下单函数 聚宽设计的函数(如前文所说准确叫法是API)的用法都写在API文档里,位置在聚宽网站导航栏-帮助-API文档 1.order按股数下单 order(security, amount, s ...
- Django Context对象 + 过滤器 + 标签
玩一玩上下文(context)对象 多数时间,你可以通过传递一个完全填充(full populated)的字典给 Context() 来初始化 上下文(Context) . 但是初始化以后,你也可以从 ...
- 全局获取 (Activity)Context,实现全局弹出 Dialog
为什么需要一个全局的 (Activity)Context 需求1:在进入 app 的时候,要求做版本检测,有新的版本的时候,弹出一个 AlertDialog,提示用户版本更新 需求2:从别的设备挤下来 ...
- logging 为全局的日志工具对象添加日志记录器
def log_file(LEVEL_NAME): # 设置日志的记录等级,常见的有四种,大小关系如下,DEBUG < INFO < WARNING <ERROR # 一旦设置级别, ...
- DDD分层架构之值对象(介绍篇)
DDD分层架构之值对象(介绍篇) 前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使 ...
- 将JSON映射为实体对象(iOS篇)
将JSON映射为实体对象(iOS篇) iOS开发人员已经习惯于将JSON转换为字典或者数组来进行操作了,接下来我要做的事情,可能匪夷所思,但是,对WP和Android开发人员而言,他们更倾向于将JSO ...
随机推荐
- Django之上传图片,分页,三级联动
Django1.8.2中文文档:Django1.8.2中文文档 上传图片 配置上传文件保存目录 1)新建上传文件保存目录. 2)配置上传文件保存目录. 后台管理页面上传图片 1)设计模型类. 2)迁移 ...
- Java基础之访问权限控制
Java基础之访问权限控制 四种访问权限 Java中类与成员的访问权限共有四种,其中三种有访问权限修饰词:public,protected,private. Public:权限最大,允许所有类访问,但 ...
- java实现截取PDF指定页并进行图片格式转换
1.引入依赖 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox& ...
- P2059 [JLOI2013]卡牌游戏 概率DP
link:https://www.luogu.org/problemnew/show/P2059 题意: 有n个人,类似约瑟夫环的形式踢人,但是报的数是不同的,是在给定的许多数中随机抽取,问最后第i个 ...
- Codeforces Round #486 (Div. 3)988D. Points and Powers of Two
传送门:http://codeforces.com/contest/988/problem/D 题意: 在一堆数字中,找出尽量多的数字,使得这些数字的差都是2的指数次. 思路: 可以知道最多有三个,差 ...
- [USACO07OCT]障碍路线 & yzoj P1130 拐弯 题解
题意 给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1. 解析 思路:构造N * M * 4个点,即将原图的每个点分裂成4个点.其中点(i ...
- JXOI 2017 颜色 题解
T3 颜色 100/100 对于这题由于数据范围小,有一种神奇的做法,我们可以把每个值随机赋值,但是保证相同颜色的和为0,就代表消去了这个颜色,我们只要取寻找合法区间就行,合法区间的寻找只要找相同前缀 ...
- 如何在GitHub上上传自己的项目
此文为转载,地址:https://blog.csdn.net/m0_37725003/article/details/80904824 本文链接:https://blog.csdn.net/m0_37 ...
- pyppeteer的使用
pyppeteer的使用 安装 属于第三方模块进行安装. pip install pyppeteer 在Linux中,如果权限不够则加上. sudo pip install pyppeteer 使用 ...
- 如何设置FreePBX的数据库用户可以通过远程来连接Mysql数据库?
要满足mysql允许通过除了本机外的主机进行使用客户端连接的方法: 要设置root用户允许通过外网用户进行连接访问的操作方法: 1.首先先改mysql的配置文件 将绑定的#bind-address = ...