Это как запланировать java-метод для запуска через 1 секунду?
В моем методе я хочу вызвать другой метод, который будет выполняться через 1 секунду позже. Это то, что у меня есть.
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
MyMethod();
Log.w("General", "This has been called one second later");
timer.cancel();
}
}, 1000);
Как это должно быть сделано?
Есть ли другие способы сделать это, так как я на Android?
Можно ли его повторить без каких-либо проблем?
Ответы
Ответ 1
Вместо Timer
я бы рекомендовал использовать ScheduledExecutorService
final ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
exec.schedule(new Runnable(){
@Override
public void run(){
MyMethod();
}
}, 1, TimeUnit.SECONDS);
Ответ 2
Существует несколько альтернатив. Но здесь Android особенный.
Если в потоке используется Looper
(и из этого потока вызывается обычно Activity
, BroadcastRecevier
и Service
методы onCreate
, onReceive
, onDestroy
и т.д.), то вы можете использовать Handler
. Вот пример:
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
myMethod();
}
}, 1000);
Обратите внимание, что здесь ничего не нужно отменять. Это будет выполняться только один раз в том же потоке, который был создан обработчиком.
Ответ 3
Если вы не в потоке пользовательского интерфейса, подумайте о том, чтобы добавить очень просто:
try
{
Thread.sleep( 1000 );
}//try
catch( Exception ex)
{ ex.printStackTrace(); }//catch
//call your method
Ответ 4
ScheduledExecutorService или AsyncTask для интерфейса.
Обратите внимание, что если вы хотите обновить интерфейс, этот код должен быть отправлен в поток пользовательского интерфейса. как в Руководство по процессам и потокам
final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(bitmap);
}
});
В View
есть хороший метод postDelayed
mImageView.postDelayed(new Runnable(){
@Override
public void run() {
mImageView.setImageResource(R.drawable.ic_inactive);
}
}, 1000);
который обновит интерфейс через 1 секунду.