Ответ
Однажды я работал над приложением с кастомной анимацией RecyclerView. В спешке не учел контекст активити, что привело к утечке памяти при быстрой прокрутке. Приложение падало на слабых устройствах.
Решение:
- Использовал WeakReference для хранения контекста
- Оптимизировал onBindViewHolder, вынеся тяжелые операции
- Добавил отмену анимаций при скролле
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val weakContext = WeakReference(itemView.context)
//...
}
Вывод: всегда тестируйте на разных устройствах и профилируйте память. Теперь я добавляю LeakCanary в каждый проект.
Ответ 18+ 🔞
Блин, вот же реальная история, как я сам себе яму выкопал. Сижу, значит, делаю кастомную анимацию для RecyclerView, красоту навожу. Всё вроде летает, гладко. А потом начал тестить на старом девайсе — и тут, ёпта, приложение просто накрылось медным тазом при быстрой прокрутке. Удивление пиздец! На мощном телефоне-то ничего, а на слабом — раз, и в пизду.
Оказалось, я в спешке, как последний распиздяй, контекст активити не там и не так зацепил. Получилась утечка памяти, овердохуища. Анимации-то запускаются, а контекст уже помер, но держится за жизнь, и память жрёт как не в себя.
Что пришлось делать, чтобы не быть ебаньком:
- WeakReference в помощь. Взял и обернул контекст в холдере в эту самую слабую ссылку. Теперь система его спокойно может прибить, когда захочет, и ничего не потечёт.
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val weakContext = WeakReference(itemView.context) //... } - onBindViewHolder почистил. Вынес оттуда всю тяжёлую хуйню — вычисления, загрузку картинок без кэша. Оставил только присваивание данных вьюхам. Терпения ноль ебать у этого метода, он должен работать как швейцарские часы.
- Анимации отменять научился. Добавил логику, чтобы при начале скролла все текущие анимации останавливались. А то они в очередь вставали и ждали своего часа, пока пользователь листает, и доверия ебать ноль к такой системе.
Вывод, чувак: теперь я на каждом проекте LeakCanary ставлю по умолчанию. Эта мартышлюшка сразу орёт, если что-то не так. И тестить надо не только на последнем айфоне, а обязательно на каком-нибудь древнем утюге, где все косяки выползают, как тараканы. Сам от себя тогда охуеешь, но зато приложение не будет падать у пользователей.