web-dev-qa-db-fra.com

Comment utiliser Handler et handleMessage dans Kotlin?

Code Java:

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

Comment convertir ce Java en Kotlin?

J'ai essayé ceci:

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

Mais cela semble incorrect et donne une erreur de temps de compilation sur object

7
nb2998

Problème: La syntaxe pour remplacer la méthode handleMessage() de la classe Handler est incorrecte.

Solution: Ajoutez override mot-clé avant la fonction que vous souhaitez remplacer.

private val mHandler = object : Handler() {

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

pdate: Comme le commentaire de @ BeniBela, lors de l'utilisation du code ci-dessus, un avertissement de peluche sera affiché

Cette classe de gestionnaire doit être statique ou des fuites peuvent se produire.

Étant donné que ce gestionnaire est déclaré en tant que classe interne, il peut empêcher que la classe externe soit récupérée. Si le gestionnaire utilise un Looper ou MessageQueue pour un thread autre que le thread principal, il n'y a pas de problème.

Si le gestionnaire utilise le Looper ou MessageQueue du thread principal, vous devez corriger votre déclaration de gestionnaire, comme suit: Déclarez le gestionnaire en tant que classe statique; Dans la classe externe, instanciez une WeakReference à la classe externe et passez cet objet à votre gestionnaire lorsque vous instanciez le gestionnaire; Faites toutes les références aux membres de la classe externe à l'aide de l'objet 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

Dans mon cas :

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

            }
        }
    }
2
Aslam Hossin

Vous pouvez le faire un peu plus facilement (sans WeakReference) en passant le looper au gestionnaire:

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