tgoop.com/dev_easy_notes/22
Last Update:
{4/4} Разобрав тему Handler стоит упомянуть одну❕интересную особенность работы с Handler через View.
У каждой View в Android также есть методы post()
, postAtTime()
, postDelayed()
, аналогичные тем, что есть у Handler, но работают немного прикольнее. Они сперва проверяют есть ли в данный момент AttachInfo, или по-другому, приатачена ли View к компоненту, например к Activity.
Если AttachInfo не равен null, тогда Message просто кладется в Handler который есть у этого самого AttachInfo, т.е в Handler главного потока, тот который Handler(Looper.getMainLooper())
Если же AttachInfo в данный момент равен null, т.е View еще не приатачена к компоненту, то Message кладется в специальную очередь, которая уникальна для каждой View. Затем, когда View приатачится к компоненту, система пробежится по этой очереди и запустит все Messages, которые были в очереди в Handler.
Почему это важно знать ❗️.
Когда работаем с Handler через View нужно вручную удалить все задачи, которые еще не выполнены, иначе компонент может утечь💧 или просто упасть💣, так как View уже не будет. Это актуально для длительных задач, если запускаем задачу с delay меньше секунды, то можно забить.
Однако, если мы делаем что-то вроде refreshlayout.postDelayed(4000) { refreshlayout.isEnabled = false }
, и при этом сами не очищаем очередь View вызвав refreshlayout.removeCallbacks(runnable)
то можем упасть 💣, так как задача может быть вызвана даже когда уйдем с этого экрана.
Поэтому для длительных задач 🕰 (которые бывают очень редко) сохраняем Runnable(тот который пихаем в метод post()
)в поле Fragment/Activity и удаляем его ручками на onDestroyView/onDestroy через метод removeCallbacks(runnable).
BY Dev Easy Notes
Share with your friend now:
tgoop.com/dev_easy_notes/22