本篇简单介绍如何在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 中使用单例模式(示例代码)相关推荐

  1. 如何在Visual Studio中直接使用示例代码浏览器搜索下载和管理代码示例

    今天微软一站式示例代码库团队发布了示例代码浏览器的Visual Studio 扩展.有了它,开发人员就可以在Visual Studio 2010里直接通过Alt+F1快捷键搜索示例代码,并方便地对示例 ...

  2. css中的代码图标,认识CSS中字体图标(示例代码)

    前端之HTML,CSS(十一) 字体图标 使用文字做出小图标的效果并超越了小图标应用精灵图,使得图标变得灵活,减少了请求次数,优化了界面的性能.字体图标本身为矢量图. 字体图标的使用过程 1.UI设计 ...

  3. android studio列模式,在Android studio 中使用单例模式

    本篇简单介绍如何在Android studio中 使用单例模式和使用注意事项. 单例模式 为什么要使用单例模式? 有一些对象我们只需要一个,只需要一个线程池 .缓存或是只有一台打印机.机器人 .机器人 ...

  4. android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)

    前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据 ...

  5. android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...

  6. java 怎么调用js代码_在Java中直接调用js代码

    JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: " ...

  7. mock.js 在html中使用demo示例代码

    mock.js 在html中使用demo示例代码 <!DOCTYPE html> <html lang="en"> <head><meta ...

  8. python3图片转代码_python3图片转换二进制存入mysql示例代码

    python3图片转换二进制存入mysql示例代码 发布于 2014-09-29 18:00:01 | 198 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面 ...

  9. 【我的Android进阶之旅】Android Studio 中 使用git提交代码报错:Can‘t commit changes from multiple changelists at once

    一.错误描述 今天在Android Studio中,Commit代码的时候报错了,然后解决了. 现在模拟复现下之前的错误,如下所示: 0 file committed, 2 files failed ...

  10. android studio 中怎么写aspectj代码,AndroidStudio中 AspectJ 基础使用 简介

    AOP(Aspect Oriented Programming)切面编程在处理一些与业务逻辑无关,但在很多地方又不得不添加相关逻辑代码,可以很好的解决相关问题,比如在Android中有些地方需要打LO ...

最新文章

  1. mysql和oracle执行计划_mysql explain执行计划详解
  2. 从JVM指令层面看try-catch-finally返回值问题
  3. STL源码剖析---迭代器失效小结
  4. mvc:default-servlet-handler/作用
  5. 解决C# Repeater内嵌Repeater 数据绑定,以及第二次层Repeater的ItemDataBound事件怎么处理...
  6. python2 urllib2_python2.7 urllib和urllib2
  7. redmine-1.2.2安装服务(附图)
  8. autotools使用总结
  9. 【MMD动作下载】随心所欲mercy(Kimagure Mercy)
  10. nms网关服务器日常维护,ZXB10-NMS网管解决方案
  11. 信息系统项目管理师 第一章 信息化和信息系统 核心知识点总结
  12. Riverbed助力皇家飞行医生服务所加速实施云优先战略
  13. 新能源车车牌识别c++
  14. 解决Word磁盘已满不让保存的问题
  15. 网络攻击知识之几种IP地址攻击方式
  16. Python数据结构20:动态规划:找零兑换问题的动态规划解法并显示使用的硬币组合
  17. 2021_RecSys_Together is Better: Hybrid Recommendations Combining Graph Embeddings and Contextualized
  18. Java系统程序Bug解决方法论(一) - 教程简介
  19. CSS | width、height中auto与100%与固定值有什么不同
  20. Material Design的基础知识

热门文章

  1. Etcd分布式存储系统
  2. 吴恩达教授机器学习课程笔记【九】- k均值聚类算法
  3. 《锁王创造营》 第一关:初出茅庐
  4. 深度学习中常见的Normalization总结—Batch Normalization,Instance Normalization
  5. 前端js实现打印excel表格
  6. LeetCode 要记得一些小trick
  7. redis安装及使用
  8. 基于单片机的电子密码锁的实现
  9. 【算法学习】【图像增强】基于拉普拉斯算子的图像锐化
  10. 【算法学习】【图像增强】【Retinex】White Patch Retinex