如何使Android程序"等待"

Jui*_*iCe 10 android timedelay

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

我发现了不同的方式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();
}
Run Code Online (Sandbox Code Playgroud)

等待是一个毫秒

Foa*_*Guy 17

你真的不应该像这样睡眠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. 
Run Code Online (Sandbox Code Playgroud)

这样你的代码仍然会被延迟,但你并没有"冻结"UI线程,这会导致最好的性能不佳,并且ANR强制关闭最坏.


Edw*_*alk 9

好的,首先,在你做的时候,永远不要用繁忙的循环实现延迟.我可以看到它的来源 - 我猜测掌上飞行器是一个没有内置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);
}
...
Run Code Online (Sandbox Code Playgroud)