11

我想让我的程序暂停一定的毫秒数,我该怎么做呢?

我找到了不同的方法,例如Thread.sleep( time ),但我认为这不是我需要的。我只想让我的代码在某行暂停 x 毫秒。任何想法将不胜感激。

这是C语言的原始代码...

extern void delay(UInt32 wait){
    UInt32 ticks;
    UInt32  pause;

    ticks = TimGetTicks();
    //use = ticks + (wait/4);
    pause = ticks + (wait);
    while(ticks < pause)
        ticks = TimGetTicks();
}

等待是毫秒数

4

8 回答 8

18

你真的不应该像这样让 UI 线程休眠,如果你这样做,你可能会因为 ActivityNotResponding 异常而让你的应用程序强制关闭。

如果您想延迟某些代码运行一段时间,请使用 Runnable 和 Handler,如下所示:

Runnable r = new Runnable() {
    @Override
    public void run(){
        doSomething(); //<-- put your code in here.
    }
};

Handler h = new Handler();
h.postDelayed(r, 1000); // <-- the "1000" is the delay time in miliseconds. 

这样,您的代码仍然会延迟,但您并没有“冻结” UI 线程,这充其量只会导致性能不佳,而最坏的情况是 ANR 强制关闭。

于 2012-07-18T19:48:41.833 回答
9

好的,首先,永远不要像你正在做的那样在繁忙的循环中实现延迟。我可以看到它来自哪里——我猜 palm Pilot 是一个没有内置 sleep() 功能的单进程设备,但在多进程设备上,像这样的繁忙循环只会带来整个处理器跪了。它会耗尽您的电池,阻止正常的系统任务正常运行,减慢其他程序或完全停止它们,使设备无响应,甚至可能导致它在您的手中变热。

您正在寻找的电话是 Thread.sleep()。您需要进行设置以捕获在您睡觉时发生的任何中断异常。

其次,使用基于事件的用户界面,如 Android(或几乎任何现代 GUI 系统),您永远不想在 UI 线程中休眠。正如其他海报所提到的,这还将冻结整个设备并导致 ANR(活动无响应)崩溃。最重要的是,这些小冻结完全破坏了用户体验。

(例外:如果您睡眠的时间间隔足够短,用户可能不会注意到,您可以侥幸逃脱。1/4 秒可能没问题,尽管根据情况它可能会使应用程序卡顿。)

不幸的是,如果您正在做的是将基于循环的应用程序移植到基于事件的系统中,那么就没有干净而优雅的方式来做您想做的事。

也就是说,正确的过程是在您的 UI 线程中创建一个处理程序并向其发送延迟消息。延迟消息将“唤醒”您的应用程序并触发它执行延迟后将要执行的任何操作。

像这样的东西:

View gameBoard;     // the view containing the main part of the game
int gameState = 0;  // starting
Handler myHandler;

public void onCreate(Bundle oldState) {
  super.onCreate(oldState);
  ...
  gameBoard = findViewById(R.layout.gameboard);
  myHandler = new Handler();
  ...
}

public void onResume() {
  super.onResume();
  displayStartingScreen();
  myHandler.postDelayed(new Runnable() { 
    gotoState1(); 
  }, 250);
}

private void gotoState1() {
  // It's now 1/4 second since onResume() was called
  displayNextScreen();
  myHandler.postDelayed(new Runnable() { 
    gotoState2();
  }, 250);
}
...
于 2012-07-18T23:18:22.803 回答
3

执行以下操作。这是参考的链接,这可能会有所帮助。

final MyActivity myActivity = this;   

    thread=  new Thread(){
        @Override
        public void run(){
            try {
                synchronized(this){
                    wait(3000);
                }
            }
            catch(InterruptedException ex){                    
            }

            // TODO              
        }
    };

    thread.start();   
于 2012-07-18T19:30:32.160 回答
2

您可以使用Handler类和postDelayed()方法来做到这一点:

Handler h =new Handler() ;
h.postDelayed(new Runnable() {
    public void run() {
                 //put your code here
              }

            }, 2000);
}

2000 ms 是执行函数内部代码之前的延迟时间

于 2018-04-21T20:54:22.943 回答
1

不知道为什么要暂停程序。如果您希望在后台执行某些任务并使用结果,请查看AsyncTask。不久前我有一个类似的问题

于 2012-07-18T19:35:45.153 回答
1

SystemClock.sleep(millis) 是一个与 Thread.sleep(millis) 非常相似的实用函数,但它忽略了 InterruptedException。

于 2016-09-15T22:00:48.850 回答
0

我认为Thread.sleep(....)可能是你想要的,你可能没有正确地做到这一点。你到底想暂停什么?希望不是 UI 线程?我猜你有一些后台线程以某种间隔执行一些任务?如果是这样,那么 Thread.sleep 将使该特定线程休眠一段时间,但是它不会暂停所有线程。

于 2012-07-18T19:29:57.537 回答
0
try {
    Thread.sleep(2000); //1000 milliseconds is one second.
}
catch (InterruptedException e) 
{
    e.printStackTrace();
}
于 2017-04-29T05:11:19.330 回答