问题描述
- 请问android的剪贴板内容监听器会不会内存泄露
-
if (clipboard == null){
clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipboard.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
//当剪贴词语被改变之后更新剪贴词时间
clipCreateTime = System.currentTimeMillis();
}
});
}如上是一个activity的代码,这个activity会不会一直被系统剪贴板持有而导致无法被回收?有什么解决办法?谢谢。
解决方案
不会。首先java程序想要内存泄露还是挺难的。第二,这个activity调用了剪贴板,将内容复制到剪贴板后,剪贴板作为android提供的一个系统服务和它并无其他关系了。第三,activity会被android依据一些规则自动回收。
参考我的博客:http://blog.csdn.net/logicteamleader/article/details/46418725
解决方案二:
感觉是不会内存泄露,毕竟你没有循环执行,而且android是有机制的,如果占用过多会杀掉一些应用、保证系统流畅。
解决方案三:
我个人觉得应该是存在内存泄露的危险的。楼上的说你没有循环执行,其实内存泄露不一定说一定要有大量内存分配才叫泄露,我见过一次register
一个广播接收者,然后没有unregister这样慢慢泄露,积少成多的。我看了ClipboardManager的源码中相关的代码
你添加的这个listenr会被add到一个mPrimaryClipChangedListeners(ArrayList)中。如果你了解过引用计数的概念,你应该知道是不会被释放的,除非你调用remove
//增加的
public void addPrimaryClipChangedListener(OnPrimaryClipChangedListener what) {
synchronized (mPrimaryClipChangedListeners) {
if (mPrimaryClipChangedListeners.size() == 0) {
try {
getService().addPrimaryClipChangedListener(
mPrimaryClipChangedServiceListener, mContext.getOpPackageName());
} catch (RemoteException e) {
}
}
mPrimaryClipChangedListeners.add(what);
}
}
//移除的
public void removePrimaryClipChangedListener(OnPrimaryClipChangedListener what) {
synchronized (mPrimaryClipChangedListeners) {
mPrimaryClipChangedListeners.remove(what);
if (mPrimaryClipChangedListeners.size() == 0) {
try {
getService().removePrimaryClipChangedListener(
mPrimaryClipChangedServiceListener);
} catch (RemoteException e) {
}
}
}
}