如何在Android studio 中使用单例模式
作者:可爱的黑精灵 发布时间:2023-03-17 21:00:38
标签:Android,studio,单例模式
目录
单例模式
单利模式使用
Android 中使用内存泄漏问题
本篇简单介绍如何在Android studio中 使用单例模式和使用注意事项。
单例模式
为什么要使用单例模式?
有一些对象我们只需要一个,只需要一个线程池 、缓存或是只有一台打印机、机器人 、机器人上面只有一个寻磁传感器。我们可以通过全局的静态变量来实现,但是全局变量在程序一开始就创建 可能比较耗费资源、可能一直没用到。单例模式和全局变量一样方便又没有它的缺点。
单利模式使用
public class Sensor {
// 使用静态变量记录唯一的实例
private static Sensor sensorInstance;
/**
* 私有的构造方法
*/
private Sensor(){}
/**
* 实例化方法
* @return Sersor
* synchronized包住不会有两个线程同时进入
*/
public static synchronized Sensor getSersorInstance(){
if(sensorInstance == null) {
sensorInstance = new Sensor();
}
// 返回Sensor唯一实例
return sensorInstance;
}
}
但是如果想要很急切的创建示例,而且在示例创建方面的负担不繁重。
public class Sensor {
private static Sensor sensorInstance = new Sensor();
private Sensor(){}
public static Sensor getSersorInstance(){
return sensorInstance;
}
}
如果有很多线程频繁的使用getSersorInstance可能就影响性能,可以使用双重检查加锁
public class Sensor {
// volatile 保证 sensorInstance 被初始化 多个线程正确的处理
private volatile static Sensor sensorInstance;
private Sensor(){}
public static Sensor getSersorInstance(){
// 检查 sensorInstance是否存在 如果不存在就进入同步区块
if(sensorInstance == null) {
// 同步区块里面的代码只有在第一次才会执行
synchronized(Sensor.class) {
if(sensorInstance == null) {
sensorInstance = new Sensor();
}
}
}
return sensorInstance;
}
}
Android 中使用内存泄漏问题
1.在实例化的时候我们经常需要传入一些参数 比如说 Context
然后顺利成章的
Sensor sensor = Sensor.getSersorInstance(MainActivity.this);
然后出现了一个很严重的问题Sensor单例持有了MainActivity 的this对象,所以当我们转跳其他Activity页面的时候MainActivity 的对象仍然得不到释放不能被回收。
所以我们应该使用Application中的 context
2.同样在急切的方法中
public class Sensor {
public static final Sensor SENSOR_INSTANCE = new Sensor();
private List<MyListener> mListenerList;
private Sensor() {
mListenerList = new ArrayList<MyListener>();
}
public static Sensor getInstance() {
return SENSOR_INSTANCE;
}
public void registerListener(MyListener listener) {
if (!mListenerList.contains(listener)) {
mListenerList.add(listener);
}
}
public void unregisterListener(MyListener listener) {
mListenerList.remove(listener);
}
}
interface MyListener {
public void onSomeThingHappen();
}
MainActivity:
public class MainActivity extends Activity {
private MyListener mMyListener=new MyListener() {
@Override
public void onSomeThingHappen() {
}
};
private Sensor sensor = Sensor.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensor.registerListener(mMyListener);
}
}
非静态的内部类(Sensor)的对象(mListenerList)都是会持有指向外部类对象(mMyListener)的引用。因此外部类对象(mMyListener)被持有了 同样的不会被回收,内存泄漏,所以需要
@Override
protected void onDestroy() {
Sensor.unregisterListener(mMyListener);
super.onDestroy();
}
来源:https://www.cnblogs.com/chenjy1225/p/9662502.html


猜你喜欢
- 其实写到这里,我已经差不多断气了。。。常规套路,这里是前三篇的传送门,需要的同学可以看一下:JAVA写文本编辑器(三) JAVA写文本编辑器
- 文档合并是一种高效文档处理方式。如果能够有一个方法能将多种不同类型的文档合并成一种文档格式,那么在文档存储管理上将为我们提供极大的便利。因此
- 问题描述:因为领导的一个需求,需要用到使用resultMap,很久没使用了,结果就除了点意外。就记录下这个问题准备两个类:author(作者
- 引言Random类是非常值得学习的一个类,所以我们今天一起学习一下Random这个类,对于模拟数据这个是随机类可是一个好东西,我们可以用这个
- 两种解决方案前端查询字典数据然后前端转码后端查询字典值,然后再转码返回给前段。本文及时针对方案2 进行的改进目标:在需要返回给前段的字段上添
- 本文实例讲述了Android编程实现手机自带内部存储路径的获取方法。分享给大家供大家参考,具体如下:我有一台中兴的Android手机,型号是
- 通过XmlDocument类修改XML文档数据,通常需要以下几个主要步骤或其中几个步骤。(1)获取一个包含XML文档数据的XmlDocume
- 由于经常用到文件处理,便自己封装了下 分享给大家。 包含写入文本 批量删除文件 下载文件 。--可直接使用/// <summary&g
- 这两天Google更新了Android Studio 1.2正式版,新版本的设置界面大变面,设置条目较旧版本进行了归类,不像以前那样列表长长
- 序列化与反序列化是.net程序设计中常见的应用,本文即以实例展示了.net实现序列化与反序列化的方法。具体如下:一般来说,.net中的序列化
- 先对问题进行描述:(1)在MyEclipse Servers视图在MyEclipse 10.7.0在某些情况下,可能无法打开。 试图打开视图
- 注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是myb
- Java 8 , Lambda + foreach 语法糖, 写起来非常的 cleanpublic static void main(Str
- 寻找到application.yml的读取的操作。从spring.factories 中查看到# Application Listeners
- 目录一 前言二 解决方法三 常见的错误案例分析1.错误:ERR_UNKNOWN_URL_SCHEME2.实现UC、华为浏览器处理的效果——&
- 1.对原生态jdbc程序中问题总结1.1 jdbc程序需求:使用jdbc查询mysql数据库中用户表的记录statement:向数据库中发送
- 这篇文章主要介绍了如何通过SpringBoot实现商城秒杀系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 在Java 字符终端上获取输入有三种方式:1、java.lang.System.in (目前JDK版本均支持)2、java.util.Sca
- 1.项目介绍本项目旨在打造一个基于RBAC架构模式的通用的、并不复杂但易用的权限管理系统。通过本项目可以较好的理解权限系统的常见业务同时学习
- 本文实例为大家分享了Java swing 仿QQ账号密码输入框,供大家参考,具体内容如下主要思路是自己定义 AccountPanel 和 P