2 u014342984 u014342984 于 2015.06.09 09:30 提问

请问android的剪贴板内容监听器会不会内存泄露

if (clipboard == null){
clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipboard.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
//当剪贴词语被改变之后更新剪贴词时间
clipCreateTime = System.currentTimeMillis();
}
});
}

如上是一个activity的代码,这个activity会不会一直被系统剪贴板持有而导致无法被回收?有什么解决办法?谢谢。

3个回答

LogicTeamLeader
LogicTeamLeader   2015.06.09 10:29

不会。首先java程序想要内存泄露还是挺难的。第二,这个activity调用了剪贴板,将内容复制到剪贴板后,剪贴板作为android提供的一个系统服务和它并无其他关系了。第三,activity会被android依据一些规则自动回收。

参考我的博客:http://blog.csdn.net/logicteamleader/article/details/46418725

LogicTeamLeader
LogicTeamLeader 回复xia小白: 这个百度一下更清楚哦。
2 年多之前 回复
u014342984
u014342984 其实我不大懂 android回收activity是根据什么回收的,能解释一下吗
2 年多之前 回复
dcxy0
dcxy0   Ds   Rxr 2015.06.09 09:58

感觉是不会内存泄露,毕竟你没有循环执行,而且android是有机制的,如果占用过多会杀掉一些应用、保证系统流畅。

u011133213
u011133213   2015.06.09 19:04

我个人觉得应该是存在内存泄露的危险的。楼上的说你没有循环执行,其实内存泄露不一定说一定要有大量内存分配才叫泄露,我见过一次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) {
}
}
}
}

Csdn user default icon
上传中...
上传图片
插入图片