单实例的类对象使用后,如何释放?

中才德创 2015-03-13 09:40:02
有个需求,在适当的时候,弹出一个Dialog,请求用户输入签名。
如果不使用单实例,只需要将mDlgSignElectron=null,就能够释放这个对象了。
使用单实例,防止弹出多个Dialog。但同时带来的一个问题,当用户输入签名退出Dialog,这个单实例的对象一直驻留在内存里,如何释放呢?
//调用
AvcSignElectronDialog mDlgSignElectron;
mDlgSignElectron = AvcSignElectronDialog.getInstance(LoginActivity.this, R.style.SignElectronDialogTheme);
mDlgSignElectron.show();

//单实例类
public class AvcSignElectronDialog extends Dialog {
private static AvcSignElectronDialog mSingleton = null;

public static synchronized AvcSignElectronDialog getInstance(Context context, int theme) {
if (mSingleton == null) {
mSingleton = new AvcSignElectronDialog(context, theme);
}
return mSingleton;
}

private AvcSignElectronDialog(Context context, int theme) {
super(context, theme);
this.mContext = context;
}
}
...全文
307 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
中才德创 2015-03-16
  • 打赏
  • 举报
回复
引用 6 楼 skgary 的回复:
我意思是,你用的时候要getInstance,不用的时候要releaseInstance 这样计数器就有增有减了。
你说的非常在理。现在我是如下这么做的,这样可以应对多线程调用了。
public class AvcSignElectronDialog extends Dialog {
	private static AvcSignElectronDialog mSingleton = null;
	private static int mCountSingleton = 0;

	public static synchronized AvcSignElectronDialog getInstance(Context context, int theme) {
		mCountSingleton++;
        if (mSingleton == null) {  
        	mSingleton = new AvcSignElectronDialog(context, theme);
        }
        return mSingleton;
    }
	
	public static synchronized void clearInstance() {
		mCountSingleton--;
        if ((mCountSingleton==0) && (mSingleton!=null)) {
        	mSingleton = null;
        }
    }
星辰的悸动 2015-03-14
  • 打赏
  • 举报
回复
就需要自己写一个释放的方法,在你用完后调用该方法,让 mDlgSignElectron=null 不就好了嘛。
中才德创 2015-03-13
  • 打赏
  • 举报
回复
引用 1 楼 skgary 的回复:
既然是单例,那么正常情况下是不应该被释放的。 如果要释放,那就要进行获取和放回计数,在计数为0是,释放。
单例,这个计数应该一直为1!
日知己所无 2015-03-13
  • 打赏
  • 举报
回复
给AvcSignElectronDialog类加一个clearInstance方法,里面执行mSingleton = null; 然后在想释放的地方,调用AvcSignElectronDialog.clearInstance();应该可以解决问题
gaofuqi 2015-03-13
  • 打赏
  • 举报
回复
1.在适当的时候,防止弹出多个Dialog?这个应该是要防止多次请求,而不是将对话框设置为单例, 例如弹出对话框是由点击某个按钮或其他组件的事件触发的,那就控制点击次数, 点击一次后将对应的组件禁用,等弹出框关闭后才激活被禁用的组件; 2.mDlgSignElectron=null 这个也不能保证对象一定会被回收,回收的过程比较复杂, 不可能通过代码来控制,具体还要看虚拟机的实现;
skgary 2015-03-13
  • 打赏
  • 举报
回复
既然是单例,那么正常情况下是不应该被释放的。 如果要释放,那就要进行获取和放回计数,在计数为0是,释放。
日知己所无 2015-03-13
  • 打赏
  • 举报
回复
引用 5 楼 HawkOfWinter 的回复:
[quote=引用 3 楼 Android_iPhone 的回复:] 给AvcSignElectronDialog类加一个clearInstance方法,里面执行mSingleton = null; 然后在想释放的地方,调用AvcSignElectronDialog.clearInstance();应该可以解决问题
试用了一下这个方法,应该是可行的。
public static synchronized void clearInstance() {  
    if (mSingleton != null) {
     	mSingleton = null;
    }
}
[/quote] 不计数有可能程序会崩溃 尤其在多线程下,一个线程刚getInstance完,另一个就给clear了,有可能会崩溃 还是别这么写了
skgary 2015-03-13
  • 打赏
  • 举报
回复
引用 4 楼 HawkOfWinter 的回复:
[quote=引用 1 楼 skgary 的回复:] 既然是单例,那么正常情况下是不应该被释放的。 如果要释放,那就要进行获取和放回计数,在计数为0是,释放。
单例,这个计数应该一直为1![/quote] 我意思是,你用的时候要getInstance,不用的时候要releaseInstance 这样计数器就有增有减了。
中才德创 2015-03-13
  • 打赏
  • 举报
回复
引用 3 楼 Android_iPhone 的回复:
给AvcSignElectronDialog类加一个clearInstance方法,里面执行mSingleton = null; 然后在想释放的地方,调用AvcSignElectronDialog.clearInstance();应该可以解决问题
试用了一下这个方法,应该是可行的。
public static synchronized void clearInstance() {  
    if (mSingleton != null) {
     	mSingleton = null;
    }
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧