Android笔记-2:重读单例模式有感

时间:2021-05-16 01:30:06

单例模式singeton,程序猿都不陌生。今天闲着没事,重温了一下设计模式。看到单例模式,忽然想到之前自己写的一个工具类,用来分享app内容到各大社交平台的,当然,具体分享到各个平台的集成我并没有自己写(除了分享到支付宝,原因是sharesdk没有集成),用了第三方sdk(sharesdk)。

我是如何封装的呢?首先我写了个类:ShareUtils,既然是工具类,我想最好用singeton来节省资源。于是写了个getInsrance()方法获取单例,具体实现方式如下:主要就是return了一个ShareUtils对象,于是我写了一个私有的个私有的构造方法:


Android笔记-2:重读单例模式有感

并把它返回:


Android笔记-2:重读单例模式有感

实现后,我想在获取ShareUtils对象同时初始化ShareSDK,具体方法名称如下:ShareSDK.initSDK(context),重点来了,看到这个加粗的context了吗,怎么获取呢?最容易想到的方式是在我上面写getInstance()方法加上参数,变成getInstance(Context context)。然后写一个构造函数传递context,之后调用ShareSDK.initSDK(context)。

Android笔记-2:重读单例模式有感
Android笔记-2:重读单例模式有感

到这里,其实有的人应该发现了问题,并且改正了,但是我并不如有些人聪慧,很傻乎乎的认为完美。于是继续码后面的代码。

工具类的作用之前说了,是用来分享的,其实主要的功能是处理分发和回调处理。这里有一段最简单的代码:Toast.makeText(context,"分享成功"0);弹出一个土司提示框,告诉用户分享成功。这里又看到了一个context,从哪里来呢?看了看getInstance(Context context)方法,正好有个context,于是我很自然的写了个全局变量,并在构造函数里面加了一句this.context= context;

Android笔记-2:重读单例模式有感


后面就可以使用全局变量context了。

代码顺利写完之后,运行分享成功返回一气呵成!最后发现有时候Toast.makeText(context,"分享成功"0);这句话没起作用,也没太在意logcat里面弹出的错误提示。具体提示是什么,太久远有些想不起来了。

到后来app测试运行一段时间,突然发现分享会崩溃。调试发现context会为空!内存泄漏了!原因是什么?原来是我用activity获取单例ShareUtil的时候,传入activity的context上下文,该context会在activity关闭之后销毁。当我第二次获取单例,没有重新给单例中的context赋值,当java内存回收了之前的context以后,自然出现了内存泄漏。

为了很快解决bug,我直接把单例模式放弃了。改成了这样:

Android笔记-2:重读单例模式有感

嘻嘻,解决问题。然后一顿牢骚,什么破单例模式,真烂,不如不用!

今天重拾单例模式,思考了一番,感觉并不是单例模式不对不好,而是我对其不是很了解,一知半解就拿来用导致问题。于是我想用单例模式重写一下方法,让内存不再泄露。待续。。。。


生活不止眼前的苟且,还有诗和远方~

Android笔记-2:重读单例模式有感
http://www.jianshu.com/p/166a429d455d