在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单例持有了MainActivitythis对象,所以当我们转跳其他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

时间: 2024-10-06 16:34:56

在Android studio 中使用单例模式的相关文章

在Android studio中如何把项目放到远程git或从远程git得到项目:

主要记录了在Android studio 中如何把项目放到远程git或从远程得到项目: 因为它已经为我们提供了git插件,所有我们部署一下就可以直接使用了.方法如下: 1.准备:先下载window上的git(在不同的系统下载不同的git),然后安装. 2.在Android studio 里点击:File->Settings(如图1),然后进入Version Control->Git;(如图二)然后点击Test(出现图三表示成功). 图1 图二 图三 3.初始化git项目(git init),操

Android Studio 中 FAILURE: Build failed with an exception. * What went wrong: Execution failed for task &#39;:compileDebugAidl&#39;.的问题解答

Android Studio 中 FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileDebugAidl'.的问题解答 完整的问题提示 Gradle: FAILURE:Build failed with an exception.*What went wrong:Execution failed for task ':compileDebugAidl'.>No

关于Android Studio中启动模拟器时,报VT-x is disabled in BIOS错误的解决办法

有时候在Android Studio中启动一个模拟器去运行程序的时候,会出现下面的错误提示:"Intel HAXM is required to run this AVD,VT-x is disabled in BIOS". 接下来我来说说解决的办法: 1. 首先在SDK Manager中检查是否安装Download Intel x86 Emulator Accelerator (HAXM installer),如果没有安装,则在SDK Manager中下载安装Download Int

在Android Studio 中正确使用adil ”绝对经典“

今天调用远程服务中遇到了一个问题,哎,调了2个小时,后来终于解决,总结来看还是对新的Android Studio 不够熟悉.那么....就可以睡觉啦!!! 在Android Studio中使用进程通信机制adil时一定要注意: 1  Android Studio提供了ADIL的创建规则,我们尽量去遵循这个规则吧,别总对Eclipse念念不忘啦: 2  在按照新建ADIL文件的步骤创建完成文件之后,***一定要在adil目录下级的包名目录中右键run一下,这样工具才会编译并在build中的gene

在Android Studio中创建项目和模拟器

北京电子科技学院 实      验      报      告 课程:移动平台应用开发实践  班级:201592  姓名:杨凤  学号:20159213 成绩:___________  指导老师:娄嘉鹏   实验日期 :2015.11.1 实验名称:           在Android Studio中创建项目和模拟器 实验内容:       1.在Android Studio中创建项目 2.创建并启动Android模拟器 一.实验简介 熟悉Android的开发环境.一些基本的操作技巧以及调试技

android studio中安装git

在android studio中方便的版本控制软件是git,当然还有其他的比如svn,但是和github一起常用算起来git方便很多怎么安装呢?请看下文: 第一步:下载安装git 先在你的电脑上安装git,去git官网上下载,http://www.git-scm.com/download/下载你的电脑对应的版本,安装的时候记住安装的路径比如D:\Git_Install\Git\bin 第二步:android studio 配置git 打开android studio的-----File ----

Android Studio中解决Gradle DSL method not found: &#39;android()&#39;

最近导入as的项目出了这样的问题 这个问题困扰了我很长时间,好吧,搜了半天全都是runProguard的,最后在stackoverflow上搜到解决办法了: http://stackoverflow.com/questions/27735646/android-studio-gradle-dsl-method-not-found-android-error17-0 解决方法: 删掉最外层的build.gradle中的 android { compileSdkVersion 19 buildToo

Android Studio中手动导入Eclipse Project

RT,这应该是很多朋友刚从Eclipse转到Android Studio后遇到最大的一个问题,首先我们需要重新认识AS里面的目录结构,在我前一篇帖子里面也有提到(Android Studio中的Project相当于Eclipse中的Workspace,Module则相当于Eclipse中的Project). 所以我们手动导入Project,其实就是导入AS里面的Module.主要有以下几个步骤: 1.复制build.gradle到需要导入的项目中 2.复制你需要导入的项目至AS Project根

Android Studio中git新建远程(remote)branch?

新建远程branch有两种方式: 方式一:命令行 git push origin  <branch-name>,branch-name就是你要新建的远程branch的名称.你可以用git bash或者Android Studio中的Terminal敲命令行. 方式二:直接通过Android Studio来创建远程branch,很简单,一步就可以了.我直接上图: 下面图中你看到远程的branch就两个:master和nick 接下来,我Push我当前的branch到远程,看下图红线框起来的地方,