private ArrayList<OutputInputPair> pairs = new ArrayList<OutputInputPair>();
public void process() {
while (!stopped) {
for (OutputInputPair pair : pairs) {
processCommandPairs(pair);
}
}
}
首先当用户点击停止按钮stopped = true
时,如果用户没有点击按钮,
始终执行processCommandPairs
方法。
停止按钮时单击
@Override
public void stop() {
Log.d(TAG, "STOP memory leak");
pairs.clear();
pairs = null;
stopped = true;
}
我只有一个问题,如果用户没有点击按钮,阵列列表中发生内存泄漏是对的吗?
如果没有,如何避免arraylist上的内存泄漏?
答案 0 :(得分:1)
重写活动的onDestroy
方法并明确将stopped
设置为true,以便在活动关闭且ArrayList可用于垃圾回收时退出while循环。
答案 1 :(得分:0)
在Android中使用WeakReference与使用普通旧Java中的WeakReference没什么不同。这是一个很好的指南,它给出了详细的解释:https://community.oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references。
每当需要对对象的引用时,您应该考虑使用它,但是您不希望该引用保护对象免受垃圾收集器的影响。一个典型的例子是当内存使用率过高时你希望被垃圾收集的缓存(通常用WeakHashMap实现)。
答案 2 :(得分:0)
关于您的问题: “我只有一个问题,如果用户不单击按钮,发生数组列表中的内存泄漏是正确的吗?”
答案是“不。这不对”
但是我知道它确实会在您的代码中发生。导致内存泄漏以及for-each循环,基本上有3种情况组合在一起(需要避免):
while(true){...}
)在这种情况下会引发内存泄漏,因为在运行内部类{内的hasNext()
,next()
或其他方法之前,将执行下面的代码段(可以在ArrayList类中检查): {1}}
Itr
由于此代码段是在无限循环内调用的,因此将创建@NotNull public Iterator<E> iterator() {
return new Itr();
}
的无限实例,并最终导致内存泄漏。