web-dev-qa-db-ja.com

ハンドラーの投稿がKotlinで機能しないAndroid

誰かが何が悪いのか教えてくれませんか?

Handler投稿Runnableを使用しようとしましたが、実行されません

var mHandler: Handler? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    mHandler = Handler()
    var runnable = Runnable {
        Log.d("TEST", "++++ runable")
        Log.d("TEST", "++++ come end")
    }
    Log.d("TEST", "++++ runnable" + runnable)
    Log.d("TEST", "++++ handle" + mHandler)
    mHandler!!.post { runnable }
}

これは出力です

09-21 00:56:04.067 4419-4419 /? D /テスト:++++ runnablecom.vpioneer.activity.MainActivity$onCreate$runnable$1@529b8fb4 09-21 00:56:04.067 4419-4419 /? D /テスト:++++ handleHandler(Android.os.Handler){529b8cb4}

7
songoku1610

最初に、!!演算子を使用しないでください。これは非常に悪い習慣です( doc から)。 ?を使用すると、同じ動作になりますが、インスタンスを実行する前にインスタンスがnullになったかどうかを確認します。

これを言って、以下を使用します:

mHandler?.post { runnable }

実際には、実行可能な行を含む新しいラムダを作成しています。より読みやすい方法で以下を参照してください:

mHandler?.post { 
   runnable 
}

これはJavaでは同等です。

mHandler.post(new Runnable(){
    public void run(){
        runnable;
    }
});

これを解決するには:

オプション1:実行可能な宣言を取り除く

mHandler?.post { /*the content of your runnable*/ }

オプション2:実行可能なインスタンスを使用する

mHandler?.post(runnable) // normal parentheses

オプション3:クレイジーな方法

mHandler?.post { runnable.run() }
16
crgarridos

このコードを試してください、これが機能していることを願っています

   Handler().postDelayed({
            // You code and delay time
   }, 1000L)

runnbaleを開始していません。これを試して:

mHandler!!.post { runnable.run() }

これも有効です:

mHandler!!.post { 
    Log.d("TEST", "++++ runable")
    Log.d("TEST", "++++ come end")
}