2015-12-11 2 views
2

Я до сих пор не понимаю, как возникают утечки памяти.Понимание утечек памяти Android в сочетании с RxJava

Я знаю, что если что-то, что используется (например, синглтон), содержит ссылку на этот объект, этот объект не может быть собран в мусор, и доступная память опускается.

Но в какой сфере это происходит? Я использую RxBinding для создания и наблюдения из событий click. Область является here, и он говорит:

Предупреждение: Созданные наблюдаемые сохраняет сильную ссылку {зрения @code}. Отказаться от подписки , чтобы освободить эту ссылку.

Зачем это необходимо? Когда я устанавливал ручной прослушиватель как анонимный внутренний класс в onCreate, он ссылается на активность, правильно? Но почему не может быть собрана вся информация об отслеживании активности-просмотра-наблюдаемого?

ответ

5

Когда я установил ручной слушатель как анонимный внутренний класс в onCreate, он имеет ссылку на деятельность, верно? Но почему не может быть собрана вся информация об отслеживании активности-просмотра-наблюдаемого?

В этом простом случае это может быть сбор мусора, и вы не должны иметь утечки.

Почему [отказ от подписки] необходимо?

Это может быть не обязательно, как в примере, указанном выше. Как указано в документации, это просто предупреждение, о котором вы должны знать. Однако это хорошая практика.

Проблема в том, что вы можете выполнять другие задачи в цепочке Rx, которые могут вызвать утечку в сочетании с вызовами RxBinding. Например:

RxViews.clicks(clickableView) 
    .flatMap(view -> getDataFromApi() 
    .subscribe(data -> onDataLoaded(data)); 

В этом случае, мы получаем данные от API, когда кнопка нажата, используя другой Observable. Этот Observable по-прежнему имеет ссылку на щелчок Observable, и, таким образом, ссылка View не может быть собрана в мусор, пока наш API-вызов не вернется (что может быть никогда).

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