2014-10-28 5 views
0

Я разработал приложение для Android, которое состоит из FragmentActivity и нескольких фрагментов, которые вызывается при изменении вкладок. Каждый фрагмент связан с представлением. Логика фрагмента инкапсулирована в отдельные классы. Классы выполняют некоторые расчетные вычисления . Результаты этих вычислений должны быть показаны в нескольких текстовых представлениях фрагмента. Далее фрагмент содержит кнопку остановки, и вычисления классов должны реагировать после нажатия кнопки остановки.Android: утечка памяти из-за переменных-членов?

Мой вопрос теперь в том, как организовать доступ к этим элементам просмотра (текстовые представления и кнопка остановки) внутри классов. Безопасно ли передать переменную, связанную с каждым текстовым представлением, в качестве переменной-члена в соответствующий класс? Вот соответствующий код, который я использую.

class ClassAFragment extends Fragment 
{ 
    ClassA classA; 
    ... 

    public View onCreateView(...) 
    { 
     Button stopButton = (Button) this.getActivity().findViewById (R.id.btnStop); 
     TextView timeLabel = (TextView) this.getActivity().findViewById (R.id.mTimeLabel); 

     this.classA = new ClassA(); 
     this.classA.setAppElements(timeLabel, stopButton); 
    } 

    ... 
} 

class ClassA 
{ 
    TextView mTimeLabel; 
    Button mStopButton; 

    public void setAppElements(TextView timeLabel, Button stopButton) 
    { 
     this.mTimeLabel = timeLabel; 
     this.mStopButton = stopButton; 

     this.mStopButton.setOnClickListener (this.mStopListener); 
    } 

    private void showCurrentProgress() 
    { 
     this.mTimeLabel.setText("some text"); 
    } 

    public void stop() 
    { 
     // react upon stop button being clicked 
    } 

    OnClickListener mStopListener = new OnClickListener() 
    { 
     @Override 
     public void onClick (View v) 
     { 
      ClassA.this.stop(); 
     } 
    }; 

    ... 
} 

Безопасен ли этот код в отношении утечек памяти? В официальной документации на Android я читал, что вы не должны передать любой объект, привязанный к контексту приложения, к переменной-члену (Handling Runtime Changes).

ответ

1

Вы можете использовать LocalBroadcastManager или Bus (например, Otto EventBus) для уведомления пользовательского интерфейса (фрагмент в вашем случае). LocalBroadcastManager работает быстрее (шина, однако, использует Reflections, которая не является chached в версиях до версии ICS Android и может быть медленнее), но шина проще. Надеюсь, поможет.

P.S. Никогда не помещайте setRetainInstance (true) на фрагменты пользовательского интерфейса.

P.P.S Если вы - убедитесь, что вы правильно отпуская виды в OnDestroy()

+0

Большое спасибо за указание мне на LocalBroadcastManager. Теперь я использую эту конструкцию для обмена сообщениями между элементами моего приложения. – LaDude

1

Они говорят о проблеме, которая может возникнуть, если вы используете setRetainInstance(true); в фрагменте и передаете ему ссылку на любой другой объект, связанный с контекстом. означает, что фрагмент не будет уничтожен, если действие будет уничтожено, и если вы передадите ему ссылку на просмотр и уничтожьте действие, это вызовет утечку памяти, так как представление не будет собираться мусором.

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