如何在Kotlin中使用Handler和handleMessage?

nb2*_*998 4 android kotlin android-handler

Java代码:

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

如何将这个Java代码转换为Kotlin?

我试过这个:

private val mHandler = object : Handler() {
    fun handleMessage(msg: Message) {
       // code here
    }
}
Run Code Online (Sandbox Code Playgroud)

但这似乎是不正确的,并给出了编译时错误 object

Pie*_*rek 12

您可以通过将 looper 传递给处理程序来更容易(没有 WeakReference):

val handler = object:  Handler(Looper.getMainLooper()) {
        override fun handleMessage(msg: Message) {
            doStuff()
        }
    }
Run Code Online (Sandbox Code Playgroud)


Nhấ*_*ang 11

根本原因:您正在创建一个从Handler类扩展但不覆盖handleMessage()方法的匿名类.

解决方案: Overler Handler方法的Handler类.

private val mHandler = object : Handler() {

    override fun handleMessage(msg: Message?) {
        // Your logic code here.
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:作为@BeniBela注释,使用上述代码时,将显示lint警告

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

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

如果Handler正在使用主线程的Looper或MessageQueue,则需要修复Handler声明,如下所示:将Handler声明为静态类; 在外部类中,实例化外部类的WeakReference,并在实例化Handler时将此对象传递给Handler; 使用WeakReference对象对外部类的成员进行所有引用.

如果处理程序在主线程上运行,则可以通过添加来禁止警告override.

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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果Handler在后台线程上运行,则可以将Handler类声明为static.

private val mHandler = object : Handler() {

    override fun handleMessage(msg: Message?) {
        // Your logic code here.
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要将外部类的实例(例如Activity)传递给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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这给出了HandlerLeak棉绒警告 (2认同)