如何在Android中等待10秒而不锁定应用程序UI

44

我遇到了一个问题,我想要等待十秒钟,因为我希望我的应用程序在这十秒钟后开始下面的代码,但是又不想停止用户进行应用程序中其他操作(不使用 Thread.sleep();)。

try {
    Log.v("msg", "WAIT CheckFrequencyRun");
    Thread.sleep(10000); // giving time to connect to wifi
    
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   //if no network
   if(wifiManager.getConnectionInfo().getNetworkId()==-1){
    //stop wifi
    wifiManager.setWifiEnabled(false);
    Log.v("msg", "no connection");
    handler.postDelayed(this, checkInterval);
   }
   //else connection
   else{
    Log.v("msg", "connection");
    onDestroy();
   }

看一下这些问题,它们看起来非常相似:
  • https://dev59.com/QW855IYBdhLWcg3w1oPa?rq=1
  • https://dev59.com/72HVa4cB1Zd3GeqPl1ZW?rq=1
  • https://stackoverflow.com/questions/9640880/android-waiting-for-an-action?rq=1
  • https://dev59.com/74Hgs4cB2Jgan1znwfPN?rq=1
- Marvin Emil Brach
postDelayed不会锁定你的UI,但Thread.Sleep会。移除Thread.Sleep并继续在你的Runnable中工作。 - Mohsen Afshin
4个回答

183

你可以使用这个:

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

停止 Handler,您可以尝试以下代码:

handler.removeCallbacksAndMessages(null);

1
简单易用,无需额外的努力。我需要一个简洁的东西,它像魔法一样运行良好。 - user3833732
美妙!像魔法一样顺利运行。谢谢! - Joshua Pinter

20
你绝不想在UI线程上调用thread.sleep(),正如你所发现的那样。这会冻结UI并且总是一个坏习惯。您可以使用单独的ThreadpostDelayed
这个SO答案展示了如何做到这一点,以及其他几个选项。
查看这些 Handler TimerTask ,看看哪一个最适合您的特定情况。

3

使用处理程序:

handler.sendEmptyMessageDelayed(1, 10000);
}

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

“TRIGGER”是什么意思?因为Android文档要求输入一个整数,无法输入字符串。 - DarkVision
我错了...这是你的消息ID。请尝试使用1。 - Anton Bevza

2
在新线程上执行此操作(将其与主线程分离)。
 new Thread(new Runnable() {
     @Override
     public void run() {
        // TODO Auto-generated method stub
     }
}).run();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接