Как вызвать метод после задержки в Android - PullRequest
681 голосов
/ 18 июня 2010

Я хочу иметь возможность вызывать следующий метод после указанной задержки. В цели c было что-то вроде:

[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];

Есть ли эквивалент этого метода в Android с Java? Например, мне нужно иметь возможность вызывать метод через 5 секунд.

public void DoSomething()
{
     //do something here
}

Ответы [ 31 ]

2 голосов
/ 18 августа 2017

С помощью CountDownTimer очень легко. Для более подробной информации https://developer.android.com/reference/android/os/CountDownTimer.html

import android.os.CountDownTimer;

// calls onTick every second, finishes after 3 seconds
new CountDownTimer(3000, 1000) { 

   public void onTick(long millisUntilFinished) {
      Log.d("log", millisUntilFinished / 1000);
   }

   public void onFinish() {
      // called after count down is finished
   } 
}.start();
1 голос
/ 22 октября 2018

Мне нравится все чище: вот моя реализация, встроенный код для использования внутри вашего метода

new Handler().postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);
1 голос
/ 25 сентября 2018

Вот ответ в Котлине вы, ленивые, ленивые люди:

Handler().postDelayed({
//doSomethingHere()
}, 1000)
1 голос
/ 26 октября 2017

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

handler.removeMessages(int what);
// Remove any pending posts of messages with code 'what' that are in the message queue.

handler.removeCallbacks(Runnable r)
// Remove any pending posts of Runnable r that are in the message queue.
1 голос
/ 27 мая 2016

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

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));

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

0 голосов
/ 19 июня 2019

Используя Kotlin, мы можем сделать следующее:

Handler().postDelayed({
    // do something after 1000ms 
}, 1000)
0 голосов
/ 10 мая 2019

Есть много способов сделать это, но лучше всего использовать обработчик, как показано ниже

long millisecDelay=3000

Handler().postDelayed({
  // do your work here
 },millisecDelay)
0 голосов
/ 03 марта 2019

В Android мы можем написать ниже код Котлина для задержки выполнения любой функции

class MainActivity : AppCompatActivity() {

private lateinit var handler: Handler

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    handler= Handler()
    handler.postDelayed({
        doSomething()
    },2000)
}

private fun doSomething() {
    Toast.makeText(this,"Hi! I am Toast Message",Toast.LENGTH_SHORT).show()
}
}
0 голосов
/ 28 февраля 2019

Аналогичное решение, но гораздо более чистое в использовании

Запишите эту функцию вне класса

fun delay(duration: Long, `do`: () -> Unit) {

    Handler().postDelayed(`do`, duration)

}

Использование:

delay(5000) {
    //Do your work here
}
0 голосов
/ 10 января 2019

Если вы используете RxAndroid, тогда обработка потоков и ошибок станет намного проще.Следующий код выполняется с задержкой

   Observable.timer(delay, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(aLong -> {
           // Execute code here
        }, Throwable::printStackTrace);
...