Я целую неделю борюсь за то, чтобы удалить из памяти ViewTreeObserver. В основном я перепробовал все способы безопасного удаления ViewTreeObserver и до сих пор не помог. В основном я наблюдаю за фрагментами rootView , чтобы определить, что он был успешно нарисован. Я создаю слушателя в классе фрагмента следующим образом:
ViewTreeObserver.OnGlobalLayoutListener listenerTree = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int width = rootView.getWidth();
int height = rootView.getHeight();
//currentDocumentType is an enum which is assigned later, with liveData in onActivityCreated
RectF visibleArea = CameraDisplayHelpers.getVisibleArea(width, height, currentDocumentType != null ? currentDocumentType.getProportions() : 30f / 19f);
if (visibleArea == null) {
//references another view(ImageView)
setupImageView(currentDocumentType);
}
rootView.getViewTreeObserver().removeGlobalOnLayoutListener(listenerTree);
} };
Затем я использую этот слушатель, наблюдая за изменениями liveData в onActivity, созданными так:
rootView.getViewTreeObserver().addOnGlobalLayoutListener(listenerTree);
После этого я вызываю этот метод в onDestroyView
@Override
public void onDestroyView() {
rootView.getViewTreeObserver().removeGlobalOnLayoutListener(listenerTree);
listenerTree = null;
super.onDestroyView();
//tried adding after super, no difference
Я не могу понять проблему, потому что она не должна присутствовать там. (Может быть, потому что я ссылаюсь на другой imageView внутри Observer, но он не отображается в журнале , который может быть нулевым?) Присоединение LeakCanary Image: