Как предотвратить активацию наблюдателей LiveData, когда фрагмент не виден - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу использовать LiveData в Fragment, чтобы наблюдать за изменением некоторых данных. Теперь давайте предположим:

  1. И Fragment A, и Fragment B имеют свою собственную структуру контейнеров в Activity, что означает, что мы будем вызывать FragmentTransaction#add() отдельно для них, и их onPause() или onResume() не будут вызываться во время добавления (пользовательский интерфейс изменить) из-за отсутствия FragmentTransaction#replace() действия.
  2. Контейнер B больше, чем A, что означает, что при добавлении B пользователи не смогут видеть A.
  3. В A есть наблюдатель LiveData с именем O, он будет наблюдать за изменением некоторых данных и обновлять пользовательский интерфейс в соответствии с ним. Ключ: мы хотим воспроизвести некоторую анимацию для изменения, вместо того, чтобы просто вызывать установщик свойств (как TextView#setText()) наивно . Например, возможно, анимация воспроизводится после того, как мы назвали RecyclerView.Adapter#notifyItemInserted()

После добавления B, A считается невидимым для пользователей. Однако жизненный цикл Fragment A или его View путем вызова getViewLifecycleOwner() все еще находится в состояниях STARTED и RESUMED. В результате анимация будет воспроизводиться после изменений данных, наблюдаемых O, но пользователи не смогут увидеть их с самого начала.

Как мы можем решить эту проблему? Любые идеи или ответы приветствуются. Заранее спасибо.

1 Ответ

1 голос
/ 24 апреля 2019

Если вы добавляете B (который занимает пространство, предположительно выделенное для A), лучше также удалить фрагмент A. Для этого вы получите несколько преимуществ:

1) Вы решаете свою проблему.(То есть, если вы используете viewLifeCycleOwner для наблюдения за LiveData) 2) Вы уменьшаете потребление памяти вашим приложением, поскольку представление фрагмента А. будет разрушено.

Это

, что означает, что мы будем вызывать FragmentTransaction # add () отдельно

, также не является проблемой.Обратите внимание, что вы можете связать FragmentTransaction s, такие как:

supportFragmentManager.beginTransaction()
    .replace(view1.id, fragmentB)
    .remove(fragmentA)
    .commit()
...