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

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

Я нашел разные способы, такие как Thread.sleep( time ), но я не думаю, что это то, что мне нужно. Я просто хочу, чтобы мой код приостановился на определенной строке за миллисекунды. Любые идеи были бы с благодарностью.

Это исходный код в 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 - количество миллисекунд

Ответ 1

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

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

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

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

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

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

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

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 now 1/4 second since onResume() was called
  displayNextScreen();
  myHandler.postDelayed(new Runnable() { 
    gotoState2();
  }, 250);
}
...

Ответ 2

Вы действительно не должны спать в потоке пользовательского интерфейса, как это, скорее всего, у вас будет сила приложения, связанная с исключением 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. 

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

Ответ 3

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

final MyActivity myActivity = this;   

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

            // TODO              
        }
    };

    thread.start();   

Ответ 4

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

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

            }, 2000);
}

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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