Расскажи о неудачном опыте

Ответ

Однажды я работал над приложением с кастомной анимацией 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 ставлю по умолчанию. Эта мартышлюшка сразу орёт, если что-то не так. И тестить надо не только на последнем айфоне, а обязательно на каком-нибудь древнем утюге, где все косяки выползают, как тараканы. Сам от себя тогда охуеешь, но зато приложение не будет падать у пользователей.