我们有一个非常长的话题:
private static class MyRunnable implements Runnable {
private final WeakReference<Context> contextRef;
private MyRunnable(Context leakable) {
contextRef = new WeakReference<>(leakable);
}
@Override public void run() {
Context context = contextRef.get();
if (context == null) return;
//VERY LONG TASK
//Would hard referencing context gotten from WeakReference.get() leak memory?
//Should contextRef be called each time context is needed?
}
}
private void startThread() {
new MyThread(this, new MyRunnable(this)).start();
}
问题全都说明了:
- 是否应该从WeakReference.get()泄漏内存中获取硬盘引用上下文?
-Should contextRef每次需要上下文时调用,以避免泄漏?
-WeakReference.get()方法通过JNI调用本机方法,会对get()方法调用贵吗?
答案 0 :(得分:1)
硬引用上下文是否会从WeakReference.get()泄漏内存中获取?
如果仍在使用某个对象,我不认为这是内存泄漏。如果你保留了你不需要的内存,这可能是个问题。您可以在不再需要时清除/丢弃字符串引用。
对对象进行弱引用不会改变任何强引用的行为。
每次需要上下文时是否应调用contextRef,以避免泄漏?
只有当你这样做时,它才会消失。如果你需要这个来返回对象(甚至在你调用run()之前),你需要保存一个字符串引用。
注意:您的示例是,第一次调用get()
时,它可以返回null
,但如果根本不运行则无关紧要,您是否可以根本不执行此操作。