// 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.
Вот еще один хитрый способ: он не будет генерировать исключение, когда исполняемый элемент изменяет элементы пользовательского интерфейса.
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));
Анимацию можно прикрепить к любому представлению.
Я не мог использовать другие ответы в моем случае. Вместо этого я использовал нативный таймер Java.
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// this code will be executed after 2 seconds
}
}, 2000);
См. Это демо:
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?");
}
}
Примечание: Этот ответ был дан, когда вопрос не указывал 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);
⋮
}
Я предлагаю Таймер , он позволяет вам запланировать вызов метода на очень конкретном интервале. Это не заблокирует ваш пользовательский интерфейс и сохранит работоспособность вашего приложения во время выполнения метода.
Другой вариант - это метод wait (); , который блокирует текущий поток на указанный промежуток времени. Это приведет к тому, что ваш пользовательский интерфейс перестанет отвечать, если вы сделаете это в потоке пользовательского интерфейса.
Спасибо за отличные ответы, я нашел решение, которое лучше всего соответствует моим потребностям.
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
}
}