Nativescript: отсутствует жизненный цикл onPause / onResume? Должен ли я остановить подписку, когда страница перемещается от / до? - PullRequest
1 голос
/ 06 февраля 2020

Я думаю, что мне чего-то не хватает в NativeScript (в настоящее время с Angular и тестированием на Android, оба с последними версиями).

С одной стороны, каждый из моих маршрутов инициализирует некоторую Наблюдаемую подписку ( отслеживание изменений данных, изменений навигации, изменений служб). С другой стороны, Nativescript хранит стек загруженных / действующих маршрутов.

Результат: если какая-либо из моих служб изменяется, подписки на сложенных маршрутах все еще выполняются (которые не отображаются на экране, но могут быть глубоко в заднем стеке) ..

Это проблема? Я имею в виду, почему эти скрытые маршруты все еще активны? Разве это не пахнет плохо, как утечка?

Итак, теперь я спрашиваю, почему у Nativescript нет логики onResume и onPause c, как на Android Sdk? Таким образом, я мог бы остановить / возобновить наблюдателей отсюда?

Пока я пытаюсь использовать:

ngOnInit() {
    console.log('onInit');
}

@HostListener('loaded')
onResume() {
    console.log('onResume');
}

@HostListener('unloaded')
onPause() {
    console.log('onPause');
}

ngOnDestroy() {
    console.log('onDestroy');
}

Но я не знаю, у меня плохое предчувствие из-за этого у меня такое ощущение, что я не тот, кто должен справиться с этим, но nativescript inner sdk. Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

загружен или выгружен - это события, запускаемые при просмотре {N}. Это базовый компонент, унаследованный любым другим компонентом в фреймворке. Событие loaded запускается при создании нижележащего собственного представления, а unloaded чаще всего происходит при его уничтожении или удалении с экрана.

Ваш Page (любой компонент, назначенный для пути маршрута, обернут страницей в Angular), является фрагментом. Пока вы перемещаетесь вперед с page-router-outlet, ваша текущая страница помещается в задний стек (историю). Событие unloaded также может быть вызвано в этот момент, но это не обязательно означает, что вы должны отписаться. Поскольку компонент все еще жив в обратном стеке, при переходе назад в обратном направлении loaded будет запущен снова.

Я бы предложил вам просто придерживаться ngOnInit, чтобы подписаться, и ngOnDestroy, чтобы отписаться от чего-либо, просто как Angular в сети. Вы должны использовать loaded событие просмотра только в тех случаях, когда вам необходимо получить доступ к элементам пользовательского интерфейса / его основному компоненту. Но помните, что это событие вызывается каждый раз, когда страница загружается, что включает в себя обратную навигацию, как обсуждалось выше. Поэтому вы можете захотеть удалить загруженный прослушиватель, как только закончите, чтобы он не выполнялся снова при обратной навигации.

Также это не повлияет на производительность, если вы оставите подписки активными, когда компонент ставится на задний стек. Я считаю, что родной вид не обновляется, если он не активен. Но вы можете отказаться от подписки в тех случаях, когда вы выполняете какие-либо тяжелые операции на контроллере, такие как тяжелые математические операции или длинные циклы и т. Д. c. Это полностью зависит от того, что вы делаете в своей подписке.

0 голосов
/ 06 февраля 2020

Вы можете посмотреть эту страницу в NS Angular документах:

https://docs.nativescript.org/angular/core-concepts/angular-navigation

особенно этот раздел:

In a native mobile application, the system will keep the navigated views alive,
so that when you come back to them, their view state will be kept the same.
Views are destroyed only when you back away from them. The page-router-outlet
houses native navigations, so its components lifecycle must match the lifecycle
of the native views. This is done by the custom NSRouteReuseStrategy.

Чтобы отписаться, я использую BaseComponent, который отслеживает все подписки, которые есть у компонента, и удаляет их в ngOnDestroy - который будет вызываться в конечном итоге.

В редких случаях мне нужно сделать это в хуках жизненного цикла NativeScript, ie. в page.on('navigatedFrom'), если требуется специальная обработка.

...