热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

如何在Androidstudio中使用单例模式

这篇文章主要介绍了如何在Androidstudio中使用单例模式,帮助大家更好的理解和学习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 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 studio 中使用单例模式的详细内容,更多关于在Android studio 中使用单例模式的资料请关注其它相关文章!


推荐阅读
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 江苏启动鲲鹏生态产业园首批应用孵化项目
    2019年9月19日,在华为全联接大会上,江苏鲲鹏生态产业园正式启动了首批鲲鹏应用孵化项目。南京市委常委、江北新区党工委专职副书记罗群等多位嘉宾出席并见证了这一重要时刻。 ... [详细]
  • 小度科技完成B轮融资,估值突破330亿
    8月24日,百度宣布其智能生活事业群组业务——小度科技成功完成B轮融资,估值达到330亿元人民币。此次融资的具体投资方尚未公布。 ... [详细]
  • 古月居课程四足机器人控制与仿真入门笔记,视频链接:link四足机器人足端轨迹规划--摆线摆线定义模型表示matlab程序摆线定义摆线,又称 ... [详细]
  • 智慧城市建设现状及未来趋势
    随着新基建政策的推进及‘十四五’规划的实施,我国正步入以5G、人工智能等先进技术引领的智慧经济新时代。规划强调加速数字化转型,促进数字政府建设,新基建政策亦倡导城市基础设施的全面数字化。本文探讨了智慧城市的发展背景、全球及国内进展、市场规模、架构设计,以及百度、阿里、腾讯、华为等领军企业在该领域的布局策略。 ... [详细]
  • 首尔国立大学推出教育性乌龟机器人Shelly:引导儿童正确对待智能设备
    在最近的ACM/IEEE人机交互会议上,来自首尔国立大学的科学家们介绍了一款创新的乌龟机器人——Shelly。这款机器人设计独特,能够对环境中的触碰和打击作出响应,通过改变颜色和收回四肢来模拟恐惧反应,旨在教育孩子们理解并尊重机器人的感受。 ... [详细]
  • 概率图模型中的条件概率分布(CPD)详解
    条件概率分布(Conditional Probability Distribution, CPD)是概率图模型中的核心概念之一,用于描述随机变量在给定条件下遵循的概率分布。本文将深入探讨CPD的不同类型及其在实际问题中的应用。 ... [详细]
  • C语言入门精选教程与书籍推荐
    本文精选了几本适合不同水平学习者的C语言书籍,从基础入门到进阶提高,帮助读者全面掌握C语言的核心知识和技术。 ... [详细]
  • 多智能体深度强化学习中的分布式奖励估计
    本文探讨了在多智能体系统中应用分布式奖励估计技术,以解决由于环境和代理互动引起的奖励不确定性问题。通过设计多动作分支奖励估计和策略加权奖励聚合方法,本研究旨在提高多智能体强化学习(MARL)的有效性和稳定性。 ... [详细]
  • 本文探讨了亚马逊Go如何通过技术创新推动零售业的发展,以及面临的市场和隐私挑战。同时,介绍了亚马逊最新的‘刷手支付’技术及其潜在影响。 ... [详细]
  • 本文由蕤内撰写,明亮公司出品,探讨了日本零售业在数字化转型中的现状与挑战。文章基于与两位在日本的投资人的深入对话,分析了日本零售业为何仍然依赖传统的POS机系统,以及中日两国在品牌建设和数字化营销上的差异。 ... [详细]
  • 题目编号:1473 时间限制:1秒 内存限制:128MB 提交次数:99 解决次数:60 ... [详细]
  • 智能全栈云风暴:AI引领的企业转型之路
    当提及AI,人们脑海中常浮现的是天才少年独自编写算法,瞬间点亮机器人的双眼。然而,真正的AI革命正由大型企业和机构推动,它们利用全栈全场景AI技术,实现数字化与智能化的深度转型。 ... [详细]
  • 随着 ChatGPT 在全球范围内的火热,众多开发者希望利用这一先进技术。然而,由于 OpenAI 官方网站注册流程复杂及支付条件限制,使得国内开发者难以便捷地接入这项技术。为了解决这个问题,APISpace 提供了一种简便的方式,让国内开发者可以轻松体验并使用 ChatGPT。 ... [详细]
  • 本文探讨了如何在一个Python脚本中定义一个方法来生成特定URL,并在Robot Framework测试环境中调用此方法,通过环境变量启动测试案例。文中还提供了一个具体的实例,展示了正确的调用方式及可能遇到的问题解决方案。 ... [详细]
author-avatar
紫岚蓝魂_578
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有