private class ProductFragment extends Fragment implements OnGetProductFromDBListener {
Activity a;
void onCreate {
a = getActivity();
new GetProductFromDB();
}
void onGetProductSuccess(Product product) { // This is not called from the main thread because of the implementation of GetProductFromDB
a.runOnUiThread(new Runnable() {
void run() {
// do some UI and Views related stuff
}
});
}
}
现在,作为匿名类的Runnable应该保留对Fragment的显式引用,对吧?这样可以防止片段被垃圾收集?
我是否应该担心发生内存泄漏?我应该如何预防?
如果我实例化一个扩展Runnable并使其成为静态的类会有帮助吗?
private static class RunnableTask extends Runnable {
ProductFragment fragment;
public RunnableTask (ProductFragment fragment) {
this.fragment = fragment;
}
void run() {
if(fragment.someBoolean) {
fragment.doSomething();
}
}
}
RunnableTask runnable = new RunnableTask();
a.runOnUiThread(runnable)
答案 0 :(得分:2)
严格来说,它不一定会导致内存泄漏。但是 - 在线程运行的持续时间内,它将保存对外部类的引用(在您的情况下为ProductFragment)。因此,它是否是内存泄漏将取决于线程将运行多长时间,以及它是否最终成为ProductFragment类的唯一引用。
您建议将其分解为静态内部类是一个很好的建议,因为这将删除对外部类的引用,从而消除潜在内存泄漏的任何可能性。
但是 - 在你的情况下,无论如何看到你提出的静态类仍然保留了外部类实例的引用,这样做没有任何好处。