享元模式防止同一个activity弹出多个提示框
问题背景:我下拉刷新的时候访问了两个接口,然后都返回登录失效,然后都调用BaseActivity中的loginFailure方法。因此弹出了两个登录失效提示对话框。(我的Dialog是封装过的,只需要传入一个Context)
我想这还不简单,dialog弄成全局的,然后调用的时候判断一下它是否为null,相当于懒汉式单例模式。结果警告将context放在静态代码中可能会引发内存泄露,因为activity切换后dialog可能还没有销毁。
我就想,如果在ondestroy中销毁activity不就得了。但是突然发现如果用的java还好,对象默认null,但如果是kotlin的话懒加载在判断lDialog是否为null的时候直接报错kotlin.UninitializedPropertyAccessException: lateinit property lDialog has not been initialized
然后看到网上有人说可以用map来管理activity然后通过isShowing()方法来判断是否显示,但不适用我这里的问题。看到map我就想到了享元模式。于是就新建了一个DialogFactory,然后通过activity进行查询判断是否需要新建该对象。这样子即防止了activity不同导致的内存泄露,又解决了创建多个dialog。
class NormalDialogFactory { private var pool: MutableMap<String, NormalDialog> = HashMap<String, NormalDialog>(); fun getDialog(activity: Activity): NormalDialog { var dialog = pool.get(activity.toString()) if (dialog == null) { dialog = NormalDialog(activity) pool.put(activity.toString(), dialog); } return dialog }
fun removeDialog(activity: Activity) { pool.remove(activity.toString()) }}
最后,当dialog关掉时别忘了清除。
dialog.setOnDismissListener(dialog -> { dialogFacotry.removeDialog(activity); });