zoukankan      html  css  js  c++  java
  • 在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();
        }
    
    
  • 相关阅读:
    MySQL数据库优化的八种方式(经典必看)
    HTML5之应用缓存---manifest---缓存使用----HTML5的manifest缓存
    ajax方法总结
    十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less))
    MySQL主从复制技术(纯干货)
    table不能遗露了tbody
    DOM 之selection
    DOM 其他一些特性
    CSSOM视图模式
    DOM 节点实例操作
  • 原文地址:https://www.cnblogs.com/chenjy1225/p/9662502.html
Copyright © 2011-2022 走看看