在Android中5秒后执行函数

c86crjj0  于 12个月前  发布在  Android
关注(0)|答案(9)|浏览(115)

我是新的Android开发,现在我的启动器活动显示只有5秒,之后,我想检查用户是否登录功能,并执行操作。
这是我代码。

@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");
    }

}

字符串

smdncfj3

smdncfj31#

因为,现在不推荐使用JavaScript,所以使用以下代码:

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

字符串

6qfn3psc

6qfn3psc2#

millisDelayTime变量分配您希望引起延迟的毫秒数。mActivityActivity的对象,用于提供应用程序上下文。在您的情况下,millisDelayTime应初始化为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);
  }
});

字符串

iibxawm4

iibxawm43#

使用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();

字符串

l3zydbqr

l3zydbqr4#

试试这个,代码创建CountDownTimer一个滴答声

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

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

字符串

2ic8powd

2ic8powd5#

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);

字符串

o0lyfsai

o0lyfsai6#

对于Kotlin的方式

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

字符串

bis0qfac

bis0qfac7#

如果可能的话,尽量避免使用postDelayed。这是一个不好的做法,因为它可能会丢失对你想要在屏幕上绘制的对象的引用,并导致NPE。请使用一个NPE。首先,创建一个全局变量NPE,你必须在其中“处理”代码的逻辑。通过使用函数NPE Message来做到这一点。

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

字符串
然后,无论你想在哪里执行它,只要调用函数:

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


请记住,在onDestroyView方法(在Fragment中)或onDestroy(在Activity中)中,您必须调用

handler.removeMessages(1)

rkue9o1l

rkue9o1l8#

实现这一点的最佳选择是使用Handler

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

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

        function(); //call function!

    }
}, TIME);

字符串

qybjjes1

qybjjes19#

**更新:**使用Kotin Couroutines:

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

字符串
这里你可以使用GlobalScope,viewmodelScope,或者lifecycle Scope。要取消这个作业,你可以调用cancel方法。

job.cancel()


你可以使用这个方法来增加一些延迟,调用下面的方法displayData(),这样它会在5秒后执行。

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

**注意:**不要使用像Thread.sleep(5000);这样的线程,因为它会阻塞你的UI,并使其无响应。

相关问题