如何在Kotlin中使用Handler和handleMessage?

问题描述 投票:3回答:2

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上给出了编译时错误

android kotlin android-handler
2个回答
8
投票

问题:覆盖handleMessage()类的Handler方法的语法不正确。

解决方案:在要覆盖的函数之前添加override关键字。

private val mHandler = object : Handler() {

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

更新:作为@ BeniBela的评论,当使用上述代码时,将显示lint警告

此Handler类应该是静态的,否则可能会发生泄漏。

由于此Handler被声明为内部类,因此可能会阻止外部类被垃圾回收。如果Handler使用Looper或MessageQueue作为主线程以外的线程,则没有问题。

如果Handler正在使用主线程的Looper或MessageQueue,则需要修复Handler声明,如下所示:将Handler声明为静态类;在外部类中,实例化外部类的WeakReference,并在实例化Handler时将此对象传递给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()
        }
    }
}

1
投票

就我而言:

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

            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.