我们有一个很长的线程:
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()泄漏内存中获得硬引用上下文?
-是否应在每次需要上下文时调用contextRef以避免泄漏?
-WeakReference.get()方法通过JNI调用本机方法,get()方法调用会昂贵吗?
是否会从WeakReference.get()泄漏内存中获得硬引用上下文?
如果仍在使用对象,则不会将其视为内存泄漏。如果要保留不需要的内存,这可能是一个问题。您可以在不再需要该字符串引用时清除/丢弃它。
对对象的弱引用不会改变任何强引用的行为。
每次需要上下文时都应该调用contextRef以避免泄漏吗?
仅当您确定它消失时,您才能执行此操作。如果需要此方法返回对象(甚至在调用run()之前),则需要保留字符串引用。
注意:您的示例在您第一次调用get()
时可以返回,null
但是如果它根本运行不重要,您是否可以根本不执行它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句