2017-07-24 333 views
4

我想每5秒運行一段代碼。我在處理程序中遇到了麻煩。 Kotlin如何做到這一點?這是我到目前爲止。還要注意,變量Timer_Preview是一個Handler。處理程序每​​5秒運行一次任務Kotlin

My Code

+0

你可以傳遞一個'Callable'你'Handler'和'sendMessageDelayed'遞歸。 –

+1

請把代碼放在問題中,而不是鏈接到它,因爲a)不是每個人都可以從工作中得到imgur和b)鏈接可能會過期,並且這個問題在將來將沒有用處。 – Todd

+0

謝謝你讓我知道! –

回答

4

既然你不能引用拉姆達目前在你,你不能引用你當你確定你分配給它的拉姆達定義屬性時,這裏最好的解決方案是一個object expression

val runnableCode = object: Runnable { 
    override fun run() { 
     handler.postDelayed(this, 5000) 
    } 
} 

假設這個屬性不是var因爲你真正想要,而這種自我呼叫正在發生的事情去改變它。

+0

謝謝,這正是我一直在尋找的!很好的 –

+0

我是否正確地假設你可以創建一個默認處理程序(即val處理程序:Handler = Handler()),然後啓動它(即handler.post(runnableCode)),它會每隔5秒運行一次你放入運行塊(在handler.postDelayed之前...)? –

+0

我相信會有效,是的。 – zsmb13

1

由於科特林還不允許遞歸lambda表達式(見KT-10350),您必須使用其他結構,如對象表述爲@ zsmb13的答案,還是普通的功能如下

fun StartTimer() { 
    Timer_Preview.postDelayed(Runnable { runnable() }, 5000) 
} 

fun runnable() { 
    //Code here 

    // Run code again after 5 seconds 
    Timer_Preview.postDelayed(Runnable { runnable() }, 5000) 
} 

然而,在您的特定情況下,它看起來像你可以只調用StartTimer()再重新佈防計時器,假設它不會做任何事情:

private val RunnableCode = Runnable { 
    //Code here 

    //Run code again after 5 seconds 
    StartTimer() 
}