97

Is there a wait function in kotlin? (I don't mean a Timer Schedule, but actually pause the execution). I have read that you can use Thread.sleep(). However, it doesn't work for me, because the function can't be found.

Ajeet Choudhary
  • 1,969
  • 1
  • 17
  • 41
OhMad
  • 6,871
  • 20
  • 56
  • 85
  • 2
    Sleep is always available, because it is part of the standard JDK. You just didn't call it with the appropriate parameters. – guenhter Jul 20 '17 at 11:47

8 Answers8

86

Thread sleep always takes a time how long to wait: https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep(long)

public static void sleep(long millis)
                  throws InterruptedException

e.g.

Thread.sleep(1_000)  // wait for 1 second

If you want to wait for some other Thread to wake you, maybe `Object#wait()' would be better

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()

public final void wait()
                throws InterruptedException

Then another thread has to call yourObject#notifyAll()

e.g. Thread1 and Thread2 shares an Object o = new Object()

Thread1: o.wait()      // sleeps until interrupted or notified
Thread2: o.notifyAll() // wake up ALL waiting Threads of object o
Community
  • 1
  • 1
guenhter
  • 11,255
  • 3
  • 35
  • 66
66

Please try this, it will work for Android:

Handler(Looper.getMainLooper()).postDelayed(
    {
        // This method will be executed once the timer is over
    },
    1000 // value in milliseconds
)
Viktor Jovanovski
  • 1,513
  • 10
  • 26
Aditay Kaushal
  • 1,021
  • 7
  • 17
  • 8
    Deprecated — use: Handler(Looper.getMainLooper()).postDelayed({ // Your Code }, 1000) – Neal Soni Jun 16 '21 at 16:52
  • This should be the accepted answer imo. Unless the original question was to hang the entire Thread, though "*pausing execution*" and sleeping threads are usually expressed similarly when explaining, in reality are not what the user needs. – Mario Jul 08 '21 at 11:36
  • 3
    @MariosYiannakou No, This answer is specific to Android but OP is asking generally how to wait in Kotlin. – YaMiN Oct 18 '21 at 19:38
  • The question is not tagged with "android", so why assume that android is the platform? – th0bse Apr 05 '23 at 17:04
39

Since new coroutines feature became available in Kotlin version 1.1 you can use non-blocking delay function with such signature:

suspend fun delay(time: Long, unit: TimeUnit = TimeUnit.MILLISECONDS)

In Kotlin 1.2 it is still located in kotlinx.coroutines.experimental package. Experimental status of coroutines is described here.

UPD: Kotlin 1.3 was released, coroutines were moved to kotlinx.coroutines package, they are no longer experimental feature.

UPD 2: To use this method inside non-suspendable methods it's possible to make it blocking, like any other suspendable methods, by surrounding with runBlocking {}:

runBlocking {
    delay(2, TimeUnit.SECONDS)
}
N. Kudryavtsev
  • 3,556
  • 1
  • 26
  • 30
27

You can achieve this easily with Kotlin coroutines

class SplashActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        CoroutineScope(Dispatchers.IO).launch {
            delay(TimeUnit.SECONDS.toMillis(3))
            withContext(Dispatchers.Main) {
                Log.i("TAG", "this will be called after 3 seconds")
                finish()
            }
        }
        Log.i("TAG", "this will be called immediately")
    }
}

build.gradle(app)

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
}
murgupluoglu
  • 6,524
  • 4
  • 33
  • 43
  • not only best written - it complies with google demands of using coroutines instead of handlers and threads on our own! – Idan Damri Oct 02 '20 at 09:59
25

You can use stuff of the standard JDK.

Another response suggests Thread.sleep(millis: Long). Personally I prefer the TimeUnit class (since Java 1.5) which provides a more comprehensive syntax.

TimeUnit.SECONDS.sleep(1L)
TimeUnit.MICROSECONDS.sleep(1000_000L)

They use Thread.sleep behind the scene, and they can throw InterruptedException too. Unfortunately, as pointed by @AndroidDev in a comment, they do not cooperate with Kotlin coroutines (since Kotlin 1.1). So we should prefer delay function in this context.

public suspend fun delay(timeMillis: Long): Unit
public suspend fun delay(duration: Duration): Unit
mcoolive
  • 3,805
  • 1
  • 27
  • 32
  • 2
    Don't use anything that uses sleep (such as Thread.sleep) inside a coroutine (suspend function). Kotlin will complain about it with "inappropriate thread-blocking method call'. – Johann May 01 '21 at 16:32
3

you can use to wait or sleep for 2 seconds

TimeUnit.SECONDS.sleep(2L)
TimeUnit.SECONDS.sleep((seconds you want to sleep) + L)
0

We can achieve functionality using Mutex class in kotlin. '.lock()' and '.unlock()' are the methods were similar to wait and notify in java.

Sai
  • 278
  • 3
  • 7
-1

You can use

SystemClock.sleep(1000)
Leonid Ivankin
  • 579
  • 4
  • 9