Почему частое очищение объектов с Garbage Collector в методе onDraw может привести к тормозящему UI

«Почему частое очищение объектов с Garbage Collector в методе onDraw может привести к тормозящему UI» — вопрос из категории Управление памятью, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Частые вызовы GC в onDraw() приводят к пропускам кадров (jank), т.к. сборка мусора требует приостановки UI-потока.

Причины:

  1. Создание временных объектов (например, new Paint(), new Rect()) в цикле onDraw()
  2. Автоупаковка примитивов (например, Integer.valueOf())

Решение:

  • Выносите создание объектов в инициализацию (поля класса)
  • Используйте canvas.save()/restore() вместо создания новых матриц
  • Для сложных вычислений - кешируйте результаты
// Плохо:
override fun onDraw(canvas: Canvas) {
    val paint = Paint() // Создается каждый кадр
    canvas.drawText("Hello", 0f, 0f, paint)
}

// Хорошо:
private val paint = Paint() // Инициализируется один раз

override fun onDraw(canvas: Canvas) {
    canvas.drawText("Hello", 0f, 0f, paint)
}