Wait for 5 seconds
Asked Answered
G

9

39

I want to wait 5 seconds before starting another public void method. The thread sleep was not working for me. If there is a way of wait() without using Threads I would love to know that.

public void check(){
    //activity of changing background color of relative layout
}

I want to wait 3 seconds before changing the relative layout color.

Gayn answered 15/1, 2017 at 17:59 Comment(3)
Possible duplicate of How to pause / sleep thread or process in Android?Blown
@Blown as specified i checked these but they did not work for me,yet thanks for considering :)Gayn
Cannot actually see the difference between the answer of the referenced question and your selected answer...Blown
P
48

just add one-liner with lambda

(new Handler()).postDelayed(this::yourMethod, 5000);

edit for clarification: yourMethod refers to the method which you want to execute after 5000 milliseconds.

Pulsimeter answered 28/4, 2017 at 11:56 Comment(4)
Good and fast solution, but this one will not work for all of needs. Good example - when you need to wait before executing / calling activity method from Adapter.Savona
is this synchronous or asynchronous ?Blent
this does not really wait does it, it just executes a function at a later time . . .Blent
(new Handler(Looper.getMainLooper())).postDelayed(null, 5000); as no augument constructure is depricated and if you want to wait without any method call pass nullGaeta
I
97

See if this works for you. Be sure to import the android.os.Handler

      Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                public void run() {
                    // yourMethod();
                }
            }, 5000);   //5 seconds

or Kotlin

Handler().postDelayed({
    // yourMethod()
}, 5000)
Infrangible answered 15/1, 2017 at 18:2 Comment(4)
It gives an error saying Handler is an Abstract cannot be instantiatedGayn
I think it's an error from my side,i'll check it again with a fresh mind tomorrowGayn
Use this Handler android.os.Handler. You're using the logging Handler and that one doesn't have a postDelay method. You're also getting that not initiated error cause you have to implement some methods to it cause you're using the Logging handlerBowser
This one should be an answer.Savona
P
48

just add one-liner with lambda

(new Handler()).postDelayed(this::yourMethod, 5000);

edit for clarification: yourMethod refers to the method which you want to execute after 5000 milliseconds.

Pulsimeter answered 28/4, 2017 at 11:56 Comment(4)
Good and fast solution, but this one will not work for all of needs. Good example - when you need to wait before executing / calling activity method from Adapter.Savona
is this synchronous or asynchronous ?Blent
this does not really wait does it, it just executes a function at a later time . . .Blent
(new Handler(Looper.getMainLooper())).postDelayed(null, 5000); as no augument constructure is depricated and if you want to wait without any method call pass nullGaeta
R
13

you can use java handlers to achieve your task:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
     // Actions to do after 5 seconds
    }
}, 5000);

for more information read the following url:

https://developer.android.com/reference/android/os/Handler.html

Rao answered 15/1, 2017 at 18:8 Comment(0)
S
6

For import use: import android.os.Handler;

new Handler().postDelayed(new Runnable() {
    public void run() {
        // yourMethod();
    }
}, 5000); // 5 seconds
Subcritical answered 30/7, 2019 at 6:41 Comment(0)
A
3

This works for me:

    val handler = Handler()
    handler.postDelayed({
        // your code to run after 2 second
    }, 2000)
Apis answered 9/3, 2020 at 17:26 Comment(0)
Q
1

what I prefer is

(new Handler()).postDelayed(this::here is your method,2000);
Quent answered 7/12, 2020 at 10:46 Comment(0)
I
1

As the parameterless constructor of the Handler class is now deprecated on Android 11 and above, if you use the above code it will throw a deprecation warning:
'Handler()' is deprecated as of API 30: Android 11.0 (R).
You should now specify the Looper in the constructor via the Looper.getMainLooper() method as following:
Java

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        // Your Code
    }
}, 5000);

Kotlin

Handler(Looper.getMainLooper()).postDelayed({
    // Your Code
}, 5000)

java - What do I use now that Handler() is deprecated? - Stack Overflow

Indiraindirect answered 3/9, 2023 at 17:16 Comment(0)
S
0

One line in Java 8

new Handler().postDelayed(() -> check(), 3000);

This is clean and nice for reading

Skim answered 9/8, 2022 at 2:30 Comment(0)
C
-1

I posted this answer to another question, but it may also help you.

Class:

import android.os.Handler;
import android.os.Looper;

public class Waiter {

WaitListener waitListener;
int waitTime = 0;
Handler handler;
int waitStep = 1000;
int maxWaitTime = 5000;
boolean condition = false;

public Waiter(Looper looper, final int waitStep, final int maxWaitTime){

    handler = new Handler(looper);
    this.waitStep = waitStep;
    this.maxWaitTime = maxWaitTime;

}

public void start(){

    handler.post(new Runnable() {
        @Override
        public void run() {

            waitListener.checkCondition();

            if (condition) {

                waitListener.onConditionSuccess();

            } else {
                if (waitTime <= maxWaitTime) {

                    waitTime += waitStep;
                    handler.postDelayed(this, waitStep);

                } else {

                    waitListener.onWaitEnd();
                }
            }
        }
    });

}

public void setConditionState(boolean condition){
    this.condition = condition;
}

public void setWaitListener(WaitListener waitListener){
    this.waitListener = waitListener;
}

}

Interface:

public interface WaitListener {

public void checkCondition();

public void onWaitEnd();

public void onConditionSuccess();

}

Usage example:

ConnectivityManager mConnMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
final int result = mConnMgr.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableMMS");

final Waiter waiter = new Waiter(getMainLooper(), 1000, 5000);
waiter.setWaitListener(new WaitListener() {

            @Override
            public void checkCondition() {
                Log.i("Connection", "Checking connection...");
                NetworkInfo networkInfo = mConnMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS);
                waiter.setConditionState(networkInfo.isConnected());
            }

            @Override
            public void onWaitEnd() {
                Log.i("Connection", "No connection for sending");
                //DO
            }

            @Override
            public void onConditionSuccess() {
                Log.i("Connection", "Connection success, sending...");
                //DO
            }

});

waiter.start();
Cougar answered 21/7, 2018 at 13:1 Comment(1)
You should really include the relevant parts of the linked answer in your own, unless it is better suited as a comment.Scurrility

© 2022 - 2025 — McMap. All rights reserved.