【问题标题】:Execute function after 5 seconds in Android在 Android 中 5 秒后执行函数
【发布时间】:2015-09-11 13:26:56
【问题描述】:

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

}

【问题讨论】:

标签: java android timer


【解决方案1】:

您可以使用Handler添加一些延迟。调用方法displayData()如下,使其在5秒后执行。

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

注意:不要使用Thread.sleep(5000);之类的线程,因为它会阻塞你的用户界面并使其反应迟钝。

【讨论】:

  • 同时删除可运行的 onPause() 并添加可运行的 onResume()。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    使用倒数计时器

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

    【讨论】:

      【解决方案4】:
      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);
      

      【讨论】:

      • 不可用..你自己试过还是只是复制粘贴在这里?
      • @satyaprakash 我试过了,它对我有用……为什么你投了反对票?
      • 因为您不能在 scheduleAtFixedRate 中传递整数参数,该参数接受 TIMEUNIT 类型的参数(最后一个参数作为句点)。
      • @satyaprakash 兄弟 scheduleAtFixedRate() 方法接受三个参数。 1. 任务 2. 延迟 3. 周期。你也可以参考这个链接tutorialspoint.com/java/util/…。 delay 和 period 只接受整数参数。我不知道你在哪里发现我错了。
      【解决方案5】:

      对于 kotlin 方式

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

      【讨论】:

        【解决方案6】:

        试试这个,代码一键创建 CountDownTimer

        timer = new CountDownTimer(5000, 5000)
        {
            public void onTick(long millisUntilFinished)
            {
            }
        
            public void onFinish()
            {
                displayData();
            }
        };
        timer.start();
        

        【讨论】:

          【解决方案7】:

          既然 Handler 现在已被弃用,请使用以下代码:

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

          【讨论】:

            【解决方案8】:

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

            int TIME = 5000; //5000 ms (5 Seconds)
            
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
            
                    function(); //call function!
            
                }
            }, TIME);
            

            【讨论】:

              【解决方案9】:

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

              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)
              

              【讨论】:

                猜你喜欢
                • 2015-06-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-01-05
                • 1970-01-01
                • 2018-10-25
                • 1970-01-01
                相关资源
                最近更新 更多