Если я правильно понял, ваш вопрос «как освободить ресурсы», а не «как очистить viewmodel».
Таким образом, вы можете сделать ваши модели просмотра как можно более светлыми, например:
abstract class MyViewModel: ViewModel() {
abstract fun freeResources()
}
и вызовите vm.freeResources()
в вашем OnPageChangeListener
или OnTabSelectedListener
или любом другом прослушивателе, который вы используете, при изменении страницы.
В этом случае вы должны получить viewModel, используя область действия.
В качестве альтернативы, если вы действительно хотите, чтобы ваша модель представления была onCleared()
, а затем была создана новая, я могу предложить использовать библиотеку scoped-vm . Это позволяет вам запрашивать модели представления для области, идентифицируемой строковым именем.
ScopedViewModelProviders
.forScope(fragment, "scope")
.of(activity)
.get(MyViewModel::class.java)
Область действия очищается (как и модели представления в ней), как только последний фрагмент, который запросил что-то из этой области, будет уничтожен. Так что используйте разные рамки для своих страниц.
Но в этом случае вам следует дважды проверить жизненный цикл ваших фрагментов: если ваш PagerAdapter хранит их для повторного использования, область действия никогда не будет очищена, и вам поможет только ручной подход.