Как использовать Handler и handleMessage в Kotlin? - PullRequest
0 голосов
/ 26 августа 2018

Java-код:

private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
       // code here
    }
};

Как преобразовать этот Java-код в Kotlin?

Я пробовал это:

private val mHandler = object : Handler() {
    fun handleMessage(msg: Message) {
       // code here
    }
}

Но, похоже, это неправильнои выдает ошибку времени компиляции на object

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

В моем случае:

@SuppressLint("HandlerLeak")
    private inner class MessageHandler(private val mContext: Context) : Handler() {
        override fun handleMessage(msg: Message) {
            when (msg.what) {

            }
        }
    }
0 голосов
/ 26 августа 2018

Проблема: Синтаксис для переопределения handleMessage() метод класса Handler неверен.

Решение: Добавьте ключевое слово override перед функцией, которую хотите переопределить.

private val mHandler = object : Handler() {

    override fun handleMessage(msg: Message?) {
        // Your logic code here.
    }
}

Обновление: Как комментарий @ BeniBela, при использовании приведенного выше кода будет отображаться предупреждение lint

Этот класс обработчика должен быть статическим, иначе могут возникнуть утечки.

Поскольку этот обработчик объявлен как внутренний класс, он может помешать внешний класс от мусора. Если обработчик использует Looper или MessageQueue для потока, отличного от основного потока, затем нет проблем.

Если обработчик использует Looper или MessageQueue основного потока, вам нужно исправить объявление Handler следующим образом: Обработчик как статический класс; Во внешнем классе создайте экземпляр Слабая ссылка на внешний класс и передача этого объекта вашему обработчику когда вы создаете экземпляр обработчика; Сделайте все ссылки на членов внешний класс, использующий объект WeakReference.

class OuterClass {

    // In the outer class, instantiate a WeakReference to the outer class.
    private val outerClass = WeakReference<OuterClass>(this)

    // Pass the WeakReference object to the outer class to your Handler
    // when you instantiate the Handler
    private val mMyHandler = MyHandler(outerClass)

    private var outerVariable: String = "OuterClass"

    private fun outerMethod() {

    }

    // Declare the Handler as a static class.
    class MyHandler(private val outerClass: WeakReference<OuterClass>) : Handler() {

        override fun handleMessage(msg: Message?) {
            // Your logic code here.
            // ...

            // Make all references to members of the outer class 
            // using the WeakReference object.
            outerClass.get()?.outerVariable
            outerClass.get()?.outerMethod()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...