web-dev-qa-db-ja.com

KotlinでHandlerとhandleMessageを使用する方法

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でコンパイル時エラーが発生します

7
nb2998

問題:HandlerクラスのhandleMessage()メソッドをオーバーライドする構文が正しくありません。

ソリューション:オーバーライドする関数の前にoverrideキーワードを追加します。

private val mHandler = object : Handler() {

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

pdate: @BeniBelaのコメントとして、上記のコードを使用すると、糸くずの警告が表示されます

このHandlerクラスは静的でなければなりません。そうしないと、リークが発生する可能性があります。

このHandlerは内部クラスとして宣言されているため、外部クラスがガベージコレクションされるのを防ぐ可能性があります。ハンドラーがメインスレッド以外のスレッドにルーパーまたはメッセージキューを使用している場合、問題はありません。

ハンドラーがメインスレッドのルーパーまたはメッセージキューを使用している場合、次のようにハンドラー宣言を修正する必要があります。ハンドラーを静的クラスとして宣言します。外部クラスで、外部クラスへのWeakReferenceをインスタンス化し、ハンドラーをインスタンス化するときにこのオブジェクトをハンドラーに渡します。 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()
        }
    }
}
12
Nhất Giang

私の場合 :

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

            }
        }
    }
2
Aslam Hossin

ハンドラーにルーパーを渡すことで(WeakReferenceなしで)少し簡単にできます。

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