如何在Kotlin中使用Handler和handleMessage?

时间:2018-08-26 10:10:44

标签: android kotlin android-handler

Java代码:

$ hdfs dfs -ls output-18
Found 16 items
output-18/_SUCCESS
output-18/part-00000
output-18/part-00001
output-18/part-00002
output-18/part-00003
output-18/part-00004
output-18/part-00005
output-18/part-00006
output-18/part-00007
output-18/part-00008
output-18/part-00009
output-18/part-00010
output-18/part-00011
output-18/part-00012
output-18/part-00013
output-18/part-00014

如何将此Java代码转换为Kotlin?

我尝试过:

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

但这似乎是不正确的,并且在private val mHandler = object : Handler() { fun handleMessage(msg: Message) { // code here } } 上给出了编译时错误

3 个答案:

答案 0 :(得分:7)

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

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

private val mHandler = object : Handler() {

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

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

  

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

     

由于此Handler被声明为内部类,因此可能会阻止   外层类被垃圾收集。如果处理程序正在使用   对于主线程以外的线程,则使用Looper或MessageQueue,然后   没有问题。

     

如果处理程序正在使用主线程的Looper或MessageQueue,   您需要修改您的Handler声明,如下所示:   处理程序作为静态类;在外部类中,实例化一个   对外部类的WeakReference并将此对象传递给您的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 :(得分:3)

您可以通过将循环程序传递给处理程序来简化操作(无需WeakReference):

val handler = object:  Handler(Looper.getMainLooper()) {
        override fun handleMessage(msg: Message) {
            doStuff()
        }
    }

答案 2 :(得分:1)

就我而言:

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

            }
        }
    }