2015-06-01 2 views
1
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, являющийся анонимным классом, должен содержать явную ссылку на фрагмент, не так ли? И это помешало бы Фрагменту быть собранным Мусором?Будет ли это конкретное использование анонимного Runnable причиной утечки памяти?

Должен ли я беспокоиться о возникшей утечке памяти и как ее предотвратить?

Помогите, если я создам экземпляр класса, который расширяет 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

Ссылка сохраняется до тех пор, пока выполняется запуск – Blackbelt

ответ

2

Строго говоря, это не обязательно приведет к утечке памяти. НО - во время прогона потока он будет ссылаться на внешний класс (ProductFragment в вашем случае). Таким образом, будет ли это утечка памяти, будет зависеть от того, как долго будет выполняться поток, и станет ли это единственной ссылкой, оставленной классу ProductFragment.

Ваше предложение взломать его в статическом внутреннем классе является хорошим, так как это удалит эту ссылку на внешний класс и, следовательно, избавит вас от потенциальной утечки памяти.

ОДНАКО - В вашем случае, поскольку ваш предложенный статический класс в любом случае сохраняет привязку к экземпляру внешнего класса, от этого нет никакой пользы.

+0

, поэтому вместо того, чтобы пытаться угадать, как долго будет выполняться метод run, я могу просто сделать некоторые предупреждения и разбить их, не так ли? просто чтобы быть в безопасности –

+0

Теперь мне нужно получить доступ к видам данных фрагмента из этого класса. В этом случае я передаю фрагмент конструктору этого класса, верно? –

+0

Точно. Я уверен, что книга Effective Java (настоятельно рекомендуется) рекомендует использовать статический внутренний класс, когда это возможно, для такого рода причин. Я бы порекомендовал взглянуть, хотите ли вы больше деталей. –

Смежные вопросы