android单例模式代码,在Android studio 中使用单例模式(示例代码)
本篇简单介绍如何在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 mListenerList;
private Sensor() {
mListenerList = new ArrayList();
}
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();
}
android单例模式代码,在Android studio 中使用单例模式(示例代码)相关推荐
- 如何在Visual Studio中直接使用示例代码浏览器搜索下载和管理代码示例
今天微软一站式示例代码库团队发布了示例代码浏览器的Visual Studio 扩展.有了它,开发人员就可以在Visual Studio 2010里直接通过Alt+F1快捷键搜索示例代码,并方便地对示例 ...
- css中的代码图标,认识CSS中字体图标(示例代码)
前端之HTML,CSS(十一) 字体图标 使用文字做出小图标的效果并超越了小图标应用精灵图,使得图标变得灵活,减少了请求次数,优化了界面的性能.字体图标本身为矢量图. 字体图标的使用过程 1.UI设计 ...
- android studio列模式,在Android studio 中使用单例模式
本篇简单介绍如何在Android studio中 使用单例模式和使用注意事项. 单例模式 为什么要使用单例模式? 有一些对象我们只需要一个,只需要一个线程池 .缓存或是只有一台打印机.机器人 .机器人 ...
- android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)
前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据 ...
- android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码
微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...
- java 怎么调用js代码_在Java中直接调用js代码
JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: " ...
- mock.js 在html中使用demo示例代码
mock.js 在html中使用demo示例代码 <!DOCTYPE html> <html lang="en"> <head><meta ...
- python3图片转代码_python3图片转换二进制存入mysql示例代码
python3图片转换二进制存入mysql示例代码 发布于 2014-09-29 18:00:01 | 198 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面 ...
- 【我的Android进阶之旅】Android Studio 中 使用git提交代码报错:Can‘t commit changes from multiple changelists at once
一.错误描述 今天在Android Studio中,Commit代码的时候报错了,然后解决了. 现在模拟复现下之前的错误,如下所示: 0 file committed, 2 files failed ...
- android studio 中怎么写aspectj代码,AndroidStudio中 AspectJ 基础使用 简介
AOP(Aspect Oriented Programming)切面编程在处理一些与业务逻辑无关,但在很多地方又不得不添加相关逻辑代码,可以很好的解决相关问题,比如在Android中有些地方需要打LO ...
最新文章
- mysql和oracle执行计划_mysql explain执行计划详解
- 从JVM指令层面看try-catch-finally返回值问题
- STL源码剖析---迭代器失效小结
- mvc:default-servlet-handler/作用
- 解决C# Repeater内嵌Repeater 数据绑定,以及第二次层Repeater的ItemDataBound事件怎么处理...
- python2 urllib2_python2.7 urllib和urllib2
- redmine-1.2.2安装服务(附图)
- autotools使用总结
- 【MMD动作下载】随心所欲mercy(Kimagure Mercy)
- nms网关服务器日常维护,ZXB10-NMS网管解决方案
- 信息系统项目管理师 第一章 信息化和信息系统 核心知识点总结
- Riverbed助力皇家飞行医生服务所加速实施云优先战略
- 新能源车车牌识别c++
- 解决Word磁盘已满不让保存的问题
- 网络攻击知识之几种IP地址攻击方式
- Python数据结构20:动态规划:找零兑换问题的动态规划解法并显示使用的硬币组合
- 2021_RecSys_Together is Better: Hybrid Recommendations Combining Graph Embeddings and Contextualized
- Java系统程序Bug解决方法论(一) - 教程简介
- CSS | width、height中auto与100%与固定值有什么不同
- Material Design的基础知识