Это как запланировать 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 секунду.