Как вызвать метод после задержки в Android

// convert datetime to unix epoch seconds
public static long ToUnixTime(DateTime date)
{
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds);
}

Должен использовать ToUniversalTime () для объекта DateTime.

685
задан Gautam 4 September 2014 в 07:31
поделиться

6 ответов

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

public class SimpleDelayAnimation extends Animation implements Animation.AnimationListener {

    Runnable callBack;

    public SimpleDelayAnimation(Runnable runnable, int delayTimeMilli) {
        setDuration(delayTimeMilli);
        callBack = runnable;
        setAnimationListener(this);
    }

    @Override
    public void onAnimationStart(Animation animation) {

    }

    @Override
    public void onAnimationEnd(Animation animation) {
        callBack.run();
    }

    @Override
    public void onAnimationRepeat(Animation animation) {

    }
}

Вы можете вызвать анимацию так:

view.startAnimation(new SimpleDelayAnimation(delayRunnable, 500));

Анимацию можно прикрепить к любому представлению.

1
ответ дан Pang 4 September 2014 в 07:31
поделиться

Я не мог использовать другие ответы в моем случае. Вместо этого я использовал нативный таймер Java.

new Timer().schedule(new TimerTask() {          
    @Override
    public void run() {
        // this code will be executed after 2 seconds       
    }
}, 2000);
294
ответ дан Jules Colle 4 September 2014 в 07:31
поделиться

См. Это демо:

import java.util.Timer;
import java.util.TimerTask;

class Test {
     public static void main( String [] args ) {
          int delay = 5000;// in ms 

          Timer timer = new Timer();

          timer.schedule( new TimerTask(){
             public void run() { 
                 System.out.println("Wait, what..:");
              }
           }, delay);

           System.out.println("Would it run?");
     }
}
20
ответ дан OscarRyz 4 September 2014 в 07:31
поделиться

Примечание: Этот ответ был дан, когда вопрос не указывал Android в качестве контекста. Ответ на тему пользовательского интерфейса Android можно найти здесь.


Похоже, что Mac OS API позволяет текущему потоку продолжить работу и планирует выполнение задачи асинхронно. В Java эквивалентная функция предоставляется пакетом java.util.concurrent . Я не уверен, какие ограничения может наложить Android.

private static final ScheduledExecutorService worker = 
  Executors.newSingleThreadScheduledExecutor();

void someMethod() {
  ⋮
  Runnable task = new Runnable() {
    public void run() {
      /* Do something… */
    }
  };
  worker.schedule(task, 5, TimeUnit.SECONDS);
  ⋮
}
182
ответ дан 22 November 2019 в 21:33
поделиться

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

Другой вариант - это метод wait (); , который блокирует текущий поток на указанный промежуток времени. Это приведет к тому, что ваш пользовательский интерфейс перестанет отвечать, если вы сделаете это в потоке пользовательского интерфейса.

6
ответ дан 22 November 2019 в 21:33
поделиться

Спасибо за отличные ответы, я нашел решение, которое лучше всего соответствует моим потребностям.

Handler myHandler = new DoSomething();
Message m = new Message();
m.obj = c;//passing a parameter here
myHandler.sendMessageDelayed(m, 1000);

class DoSomething extends Handler {
    @Override
    public void handleMessage(Message msg) {
      MyObject o = (MyObject) msg.obj;
      //do something here
    }
}
36
ответ дан 22 November 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: