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
でコンパイル時エラーが発生します
問題: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()
}
}
}
私の場合 :
@SuppressLint("HandlerLeak")
private inner class MessageHandler(private val mContext: Context) : Handler() {
override fun handleMessage(msg: Message) {
when (msg.what) {
}
}
}
ハンドラーにルーパーを渡すことで(WeakReferenceなしで)少し簡単にできます。
val handler = object: Handler(Looper.getMainLooper()) {
override fun handleMessage(msg: Message) {
doStuff()
}
}