Jishad
Jishad

Reputation: 2965

Execute function after 5 seconds in Android

I am new in android development and now my launcher activity show only 5 seconds and after that I want to check the user is logged in or not function and perform the actions.

here is my code.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    exactPreferences = getSharedPreferences("ExactPreference",MODE_PRIVATE);
    setContentView(R.layout.activity_landing_page);

    session = exactPreferences.getString(Model.getSingleton().SHARED_SESSION_ID,null);
    Log.i("Session Id",session);
        displayData(); // I want to perform this function after 5 seconds.
}


private void displayData() {
    if(session.equals("")){
        Intent loginIntent = new Intent(LandingPage.this,
                LoginActivity.class);
        startActivity(loginIntent);
        Log.i("User Logged In", "False");
    }
    else
    {
        Intent objIntent = new Intent(LandingPage.this,
                IndexPageActivity.class);
        startActivity(objIntent);
        Log.i("User Logged In", "True");
    }

}

Upvotes: 52

Views: 101565

Answers (9)

Kartheek
Kartheek

Reputation: 7214

Updated: Using Kotin Couroutines:

val job = scope.launch {
   delay(5000)
   displayData();
 }

Here you can use GlobalScope, viewmodelScope, or lifecycleScope. To cancel this job you can call the cancel method.

job.cancel()

You can use the Handler to add some delay.Call the method displayData() as below so that it will be executed after 5 seconds.

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

Note : Do not use the threads like Thread.sleep(5000); because it will block your UI and and makes it irresponsive.

Upvotes: 137

vishal pathak
vishal pathak

Reputation: 91

Since, Handler is now deprecated so use this code :

 new Handler(Looper.myLooper()).postDelayed(new Runnable() {
     @Override
     public void run() {
         //do what you want 
     }
 }, 5000);

Upvotes: 7

Jorgesys
Jorgesys

Reputation: 126455

The best option to achieve this is using a Handler:

int TIME = 5000; //5000 ms (5 Seconds)

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {

        function(); //call function!

    }
}, TIME);

Upvotes: 0

lgn
lgn

Reputation: 187

For kotlin way

Handler().postDelayed({
        //do something
    }, 5000)

Upvotes: 4

Fazeel Qureshi
Fazeel Qureshi

Reputation: 864

long delay = 1000;
long period = 50000;
Timer task = new Timer();
task.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        getDriver(sessionManager.getKEY(), ride_id);
    }
}, delay, period);

Upvotes: 4

franzesz
franzesz

Reputation: 336

When possible, try to avoid using postDelayed. It is a bad practice, since it can lose the reference to the objects that you want to draw on your screen and cause a NPE. Use a Handler instead. First of all, create a global variable Handler in which you will have to "handle" the logic for your code. Do so by using the function handleMessage.

Handler  handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        if(msg.what == 1){
            // your code here
        }
    }
};       

Then, wherever you want to execute it, just call the function:

// 1 is the ID of your process
handler.sendEmptyMessageDelayed(1, 5000);

Please remember that in the onDestroyView method (in a Fragment) or the onDestroy (in an Activity) you will have to call

    handler.removeMessages(1)

Upvotes: 0

Phantômaxx
Phantômaxx

Reputation: 38098

Use a CountDownTimer

// There's a TextView txtCount in Main Activity

final int secs = 5;
new CountDownTimer((secs +1) * 1000, 1000) // Wait 5 secs, tick every 1 sec
{
    @Override
    public final void onTick(final long millisUntilFinished)
    {
        txtCount.setText("" + (int) (millisUntilFinished * .001f));
    }
    @Override
    public final void onFinish()
    {
        txtCount.setText("GO!");
        finish();
        // Time's up - Start the Login Activity
        final Intent tnt =
            new Intent(getApplicationContext(), LoginActivity.class);
        startActivity(tnt);
    }
}.start();

Upvotes: 6

mushahid
mushahid

Reputation: 514

Assign millisDelayTime variable with the milliseconds you desire to cause a delay. mActivity is an object of Activity for providing Application Context. In your case millisDelayTime should be initialized with 5000

mActivity.runOnUiThread(new Runnable() {
@Override
    public void run() {
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
       @Override
       public void run() {
             //your code here
       }
    }, millisDelayTime);
  }
});

Upvotes: 6

bongo
bongo

Reputation: 763

Try this, code create CountDownTimer with one tick

timer = new CountDownTimer(5000, 5000)
{
    public void onTick(long millisUntilFinished)
    {
    }

    public void onFinish()
    {
        displayData();
    }
};
timer.start();

Upvotes: 4

Related Questions