constructor Handler()' is deprecated. Deprecated in Java

Рейтинг: 0Ответов: 1Опубликовано: 01.04.2023

Необходим вызов функции проверки координат, для этого я использую функцию touch, которая с помощью Handler() вызывает раз в пол секунды функцию проверки координат и при касании экрана раскрашивает квадратики (меняет цвет imageView, при касании по координатам расположения этого элемента). При сборке выдается предупреждение

constructor Handler()' is deprecated. Deprecated in Java.

Я заменил на более новую версию Handler(Looper.getMainLooper()).postDelayed, но теперь не работает эта часть кода, при касании квадратики не раскрашиваются, то есть функция не вызывается

private fun touch () {
    val handler = Handler()
    handler.postDelayed(object : Runnable {
        override fun run() {
            checkCoordinates () // функция проверки координат и раскрашивания квадратиков
            mX = 0.0f
            mY = 0.0f
            handler.postDelayed(this, 500)
        }
    }, 0)
}

Заменено на:

    Handler(Looper.getMainLooper()).postDelayed({
        fun run() {
            checkCoordinates()
            mX = 0.0f
            mY = 0.0f
        }
    }, 500)

Ответы

▲ 1Принят

Вам нужно было просто добавить аргумент в конструктор, а вы полностью изменили код и теперь вызов не периодический, а отложенный одноразовый. Верните как было:

private fun touch () {
    val handler = Handler(Looper.myLooper())
    handler.postDelayed(object : Runnable {
        override fun run() {
            checkCoordinates () // функция проверки координат и раскрашивания квадратиков
            mX = 0.0f
            mY = 0.0f
            handler.postDelayed(this, 500)
        }
    }, 0)
}

P.S. устаревший конструктор без параметров равносилен конструктору с аргументом Looper.myLooper() - это означает что хандлер будет выполнять код в том потоке, в котором он создан.

Looper.getMainLooper() - означает что хандлер будет выполнять код в главном (UI) потоке.