Как сделать Android-программу "wait"

Я хочу, чтобы моя программа приостановилась на определенное количество миллисекунд, как именно я это сделаю?

Я нашел разные способы, такие как 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();
}

wait-это количество миллисекунд

8 ответов


OK, прежде всего, никогда не реализуйте задержку с циклом занятости, как вы это делаете. Я вижу, откуда это взялось-я предполагаю, что palm pilot был однопроцессорным устройством без встроенной функции sleep (), но на многопроцессорном устройстве такой занятый цикл просто ставит весь процессор на колени. Он убивает батарею, предотвращает правильную работу обычных системных задач, замедляет другие программы или полностью останавливает их, делает устройство невосприимчивым и даже может вызвать его чтобы согреться в твоих руках.

звонок вы почувствуете поток.сон.)( Вам нужно настроить, чтобы поймать любые исключения прерываний, которые происходят во время сна.

во-вторых, с пользовательскими интерфейсами на основе событий, такими как Android (или почти любая современная система GUI), вы никогда не хотите спать в потоке пользовательского интерфейса. Это также заморозит все устройство и приведет к сбою ANR (активность не отвечает), Как упоминалось в других плакатах. Самое главное, те маленькие зависания полностью разрушают пользовательский интерфейс.

(исключение: если вы спите достаточно короткие интервалы, которые пользователь, вероятно, не заметит, Вы можете уйти с ним. 1/4 секунды, вероятно, в порядке, хотя это может сделать приложение janky в зависимости от ситуации.)

к сожалению, нет чистого и элегантного способа сделать то, что вы хотите, если вы делаете перенос приложения на основе цикла в систему на основе событий.

что сказал, Правильное процедура заключается в создании обработчика в потоке пользовательского интерфейса и отправке ему отложенных сообщений. Отложенные сообщения "разбудят" ваше приложение и вызовут его для выполнения того, что он собирался сделать после задержки.

что-то вроде этого:

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

вы действительно не должны спать в потоке пользовательского интерфейса, как это, вы, вероятно, будете иметь силу приложения близко с ActivityNotResponding исключением, если вы это сделаете.

Если вы хотите задержать некоторый код от запуска в течение определенного времени, используйте Runnable и обработчик, как это:

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. 

таким образом, ваш код все еще задерживается, но вы не "замораживаете" поток пользовательского интерфейса, который в лучшем случае приведет к низкой производительности, а в худшем-к закрытию ANR.


сделать что-то вроде следующего. Вот ссылка на ссылка, это может быть полезно.

final MyActivity myActivity = this;   

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

            // TODO              
        }
    };

    thread.start();   

Не уверен, почему вы хотите, чтобы программа делать паузы. Если вы хотите выполнить какую-то задачу в фоновом режиме и использовать результаты, посмотрите на AsyncTask. У меня было аналогичный вопрос некоторое время назад.


В SystemClock.sleep (millis) - это функция утилиты, очень похожая на Thread.сон (Миллис), но он игнорирует InterruptedException.


можно использовать Handler класс а postDelayed() метод для этого:

Handler h =new Handler() ;

h.postDelayed(new Runnable() {

  public void run() {

    //put your code here

  }, 2000);

2000 МС-это время задержки перед выполнением кода внутри функции


Я думаю нить.сон.(...) вероятно, это то, что вы хотите, вы просто не можете делать это правильно. Что именно вы пытаетесь приостановить? Надеюсь, не поток пользовательского интерфейса? Я предполагаю, что у вас есть фоновый поток, выполняющий некоторые задачи в какой-то интервал? Если да, то нить.sleep поместит эту конкретную нить в спящий режим на определенное время, однако не приостановит все потоки.


try {
    Thread.sleep(2000); //1000 milliseconds is one second.
}
catch (InterruptedException e) 
{
    e.printStackTrace();
}