Kotlin에서 지연 후 함수를 호출하는 방법은 무엇입니까?


답변:


134

당신은 일정 을 사용할 수 있습니다

inline fun Timer.schedule(
    delay: Long, 
    crossinline action: TimerTask.() -> Unit
): TimerTask (source)

예 (@Nguyen Minh Binh 덕분에-여기에서 찾았습니다 : http://jamie.mccrindle.org/2013/02/exploring-kotlin-standard-library-part-3.html )

import java.util.Timer
import kotlin.concurrent.schedule

Timer("SettingUp", false).schedule(500) { 
   doSomething()
}

16
감사! 매우 쉽습니다. 여기에서 예를 찾았습니다. jamie.mccrindle.org/2013/02/… Timer("SettingUp", false).schedule(500) { doSomething() }
Nguyen Minh Binh

9
가져 오기 java.util.Timer 및 가져 오기 kotlin.concurrent.schedule
Customizer

3
@Matias Elorriaga은 나를 위해, 새로운 브랜드 파일에 이러는 심지어 사용자 정의 말했다 수입을 추가, 컴파일되지 않습니다
Sulfkain

3
파일에 넣을 필요는 없습니다. 그 방법은 stdlib의 일부입니다. 답의 첫 줄에있는 링크를 따르십시오
Matias Elorriaga

3
kotlin.concurrent.scheduleKotlin은 서명 불일치에 대해서만 불평했기 때문에 원래 가져 오기 후에도 컴파일되지 않을 것이라고 생각 했지만 Long 대신 Int를 전달하려고한다는 것을 깨달았습니다. 그것을 수정 한 후 컴파일했습니다.
Joe Lapp

178

사용하는 옵션도 있습니다 Handler -> postDelayed

 Handler().postDelayed({
                    //doSomethingHere()
                }, 1000)

18
질문은 일반적인 kotlin 방법을 요구하기 때문에 안드로이드에서만 사용할 수 있다는 점을 추가하십시오. (Android 태그가 있지만)
Yoav Sternberg

5
그것은 당신의 측면에서 건설적이지 않습니다. 결과적으로 사용자가 안드로이드 태그를 검색 할 때 이것이 잘못된 대답이라고 생각할 수 있습니다.
Bogdan Ustyak

9
Android의 경우 타이머보다 핸들러를 사용하는 것이 좋습니다. stackoverflow.com/questions/20330355/timertask-or-handler
woprandi

액티비티 / 조각 완료 후 핸들러를 제거하기위한 코드를 추가해야한다고 생각합니다.
CoolMind

의도 한 경우 UI 스레드에서 실행되지 않습니다.
AndroidDev

93

여러 가지 방법

1. Handler수업 이용

Handler().postDelayed({
    TODO("Do something")
    }, 2000)

2. Timer수업 사용

Timer().schedule(object : TimerTask() {
    override fun run() {
        TODO("Do something")
    }
}, 2000)

더 짧은

Timer().schedule(timerTask {
    TODO("Do something")
}, 2000)

최단

Timer().schedule(2000) {
    TODO("Do something")
}

3. Executors수업 사용

Executors.newSingleThreadScheduledExecutor().schedule({
    TODO("Do something")
}, 2, TimeUnit.SECONDS)

1
그리고 여기서 가장 좋은 해결책은 무엇이라고 생각하십니까?
Tamim Attafi

1
아마도 핸들러를 사용하는 첫 번째 것입니다. 참조 stackoverflow.com/a/40339630/1159930
Markymark

36

다음 두 라이브러리를 가져와야합니다.

import java.util.*
import kotlin.concurrent.schedule

그 후에 다음과 같이 사용하십시오.

Timer().schedule(10000){
    //do something
}

27

당신은 수있는 launch코 루틴은, delay그것은 다음 함수를 호출 :

 /*GlobalScope.*/launch {
   delay(1000)
   yourFn()
 }

클래스 또는 객체가 외부 GlobalScope에서 코 루틴을 실행하도록하기 위해 CoroutineScope필요한 경우 주변 클래스 를 구현하는 것이 좋습니다. 그렇지 않으면 필요한 경우 해당 범위와 관련된 모든 코 루틴을 취소 할 수 있습니다.


감사! 이상한, 그 코 루틴은 2018 만 언급했다
CoolMind

그들은 아주 새로운 그래서 @coolMind 그들은 몇 개월 이후 안정 ...
조나스 윌름

예, 10 월부터 11 월까지는 있지만 이전에는 존재했습니다.
CoolMind

23
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)

1
중괄호 대신 "timerTask"를 작성해야하는 이유를 설명해 주시겠습니까?
Hugo Passos

2
당신이 생각합니다. 첫 번째 주장으로 Timer.schedule()a TimerTask를 기대합니다 . kotlin.concurrent.timerTask()주어진 람다를 TimerTask인스턴스로 감 쌉니다 . 여기를 참조하십시오 : kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/…
Blieque

또한 예를 들어 Timer객체를 두 번 이상 사용하지 않을 경우 주어진 예를 한 줄로 요약 할 수 있습니다 Timer().schedule(timerTask { ... }, 3000). 보다 Kotlin 친화적 인 옵션도 제공됩니다. jonguer의 답변을 참조하십시오.
Blieque

10

3 초 후에 토스트를 보여주는 간단한 예 :

fun onBtnClick() {
    val handler = Handler()
    handler.postDelayed({ showToast() }, 3000)
}

fun showToast(){
    Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}

1
통화를 취소 할 수 있습니까?
Eduardo Oliveros

6

일반적인 사용법을 찾고 있다면 여기 내 제안이 있습니다.

이름이 다음과 같은 클래스를 만듭니다 Run.

class Run {
    companion object {
        fun after(delay: Long, process: () -> Unit) {
            Handler().postDelayed({
                process()
            }, delay)
        }
    }
}

그리고 이렇게 사용하십시오 :

Run.after(1000, {
    // print something useful etc.
})

확장 기능으로이를 단순화 할 수 있습니다.
Vlad

@ Ogulcan, 더 kotlinic lamda Run.after(1000) { toRun() }. 내가 맞
습니까

0

사용 후 SingleThread 를 죽일 필요가 없으므로 SingleThread를 사용하는 것이 좋습니다 . 또한 " stop ()"메소드는 Kotlin 언어에서 더 이상 사용되지 않습니다.

private fun mDoThisJob(){

    Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
        //TODO: You can write your periodical job here..!

    }, 1, 1, TimeUnit.SECONDS)
}

또한 주기적 작업에 사용할 수 있습니다. 매우 유용합니다. 매초마다 작업을 수행하려는 경우 매개 변수가 다음과 같이 설정 될 수 있습니다.

Executors.newSingleThreadScheduledExecutor (). scheduleAtFixedRate (실행 가능한 명령, 긴 초기 지연, 장기, TimeUnit 단위);

시간 단위 값은 NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS입니다.

아리따움

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.