Почему ViewTreeObserver продолжает просачиваться во фрагмент? - PullRequest
0 голосов
/ 06 января 2019

Я целую неделю борюсь за то, чтобы удалить из памяти 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:

enter image description here

...