2017-09-21 29 views
1

は、誰かが間違っているものを私に示してもらえ間違っている、私はHandlerポストRunnableを使用しようとするが、それはこれが出力ハンドラのポストがKotlinに動作していない、何が

09-21 00:56:04.067 4419-4419/? D/TEST: ++++ runnablecom.vpioneer.activity.MainActivity$onCreat[email protected] 09-21 00:56:04.067 4419-4419/? D/TEST: ++++ handleHandler (android.os.Handler) {529b8cb4}

ある

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 } 
} 

実行していません

+0

私は' lateinitのvar mHandlerにあなたの最初の行を変更することをお勧めします。次に、null可否の懸念について心配する必要はありません。 –

答えて

7

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

使用して、これを言っ:

mHandler?.post { runnable } 

をあなたが実際に実行可能な行を含む新しいラムダを作成しています。より読みやすいように、ここでは以下を参照:

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

は、この問題を解決するには:

オプション1:が実行可能に宣言

を取り除く。これは、Javaで同等である

mHandler?.post { 
    runnable 
} 

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

オプションあなたは `onCreate`それを作成しているので、Handler`:2:

mHandler?.post(runnable) // normal parentheses 

オプション3あなたの実行可能なインスタンスを使用して:クレイジーな方法

mHandler?.post { runnable.run() } 
+0

ありがとう、私の大きな間違い – songoku1610

1

runnbaleを開始していません。これを試してみてください:

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

これも有効です。

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

エラーが発生しました:** java.lang.RuntimeException:Looper.prepare()を呼び出していないスレッド内でハンドラを作成できません** –

関連する問題