这种匿名Runnable的特殊使用是否会导致内存泄漏?

时间:2015-06-01 08:03:02

标签: java android multithreading memory-leaks

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)

1 个答案:

答案 0 :(得分:2)

严格来说,它不一定会导致内存泄漏。但是 - 在线程运行的持续时间内,它将保存对外部类的引用(在您的情况下为ProductFragment)。因此,它是否是内存泄漏将取决于线程将运行多长时间,以及它是否最终成为ProductFragment类的唯一引用。

您建议将其分解为静态内部类是一个很好的建议,因为这将删除对外部类的引用,从而消除潜在内存泄漏的任何可能性。

但是 - 在你的情况下,无论如何看到你提出的静态类仍然保留了外部类实例的引用,这样做没有任何好处。