Что эквивалентно javascript setTimeOut() для Android?

Мне нужен эквивалентный код setTimeOut(call function(),milliseconds); для Android.

setTimeOut(call function(),milliseconds);

person José Francisco Lara Aguilar    schedule 07.01.2012    source источник
comment
возможный дубликат stackoverflow.com/q/4817933/776084   -  person RanRag    schedule 07.01.2012


Ответы (4)


Вы, вероятно, захотите проверить TimerTask

Поскольку вы снова упомянули об этом, я хотел бы дать другую рекомендацию, а именно Обработчик. Его проще использовать, чем TimerTask, поскольку вам не нужно явно вызывать runOnUiThread, поскольку обработчик будет связан с потоком пользовательского интерфейса, если он создан в потоке пользовательского интерфейса или вы создаете его с помощью основного цикла в его конструкторе. Это будет работать следующим образом:

private Handler mHandler;
Runnable myTask = new Runnable() {
  @Override
  public void run() {
     //do work
     mHandler.postDelayed(this, 1000);
  }
}

@Override
public void onCreate(Bundle savedState) {
  super.onCreate(savedState);
  mHandler = new Handler(Looper.getMainLooper());
}
//just as an example, we'll start the task when the activity is started
@Override
public void onStart() { 
  super.onStart();
  mHandler.postDelayed(myTask, 1000);
}

//at some point in your program you will probably want the handler to stop (in onStop is a good place)
@Override
public void onStop() {
  super.onStop();
  mHandler.removeCallbacks(myTask);
}

Есть некоторые вещи, которые следует знать об обработчиках в вашей деятельности:

  1. Ваша активность может быть отключена/не видна, пока ваш обработчик все еще работает, если вы не остановите ее в onStop (или onPause, если вы запустили ее в onResume), это приведет к проблемам, если вы попытаетесь обновить пользовательский интерфейс.
  2. Если ваш телефон переходит в глубокий сон, обработчики не будут срабатывать так часто, как вы указали. Я знаю это, поскольку я провел обширное тестирование устройств Bluetooth, чтобы проверить подключение после многих часов работы, и я использовал обработчики вместе с печатью журнала каждый раз, когда они срабатывали.
  3. Если вам нужно, чтобы этот таймер работал непрерывно, я рекомендую поместить его в службу, которая будет работать дольше, чем активность. Зарегистрируйте свою деятельность в службе (путем реализации интерфейса, определенного в службе для связи со службой).
person Matt Wolfe    schedule 07.01.2012

Это код, который я использовал в своем текущем проекте. Я использовал TimerTask, как сказал Мэтт. 60000 это миллисекунды. = 60 сек. я использовал его, чтобы обновить результаты матчей.

private void refreshTimer() {
        autoUpdate = new Timer();
        autoUpdate.schedule(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    public void run() {
                        adapter = Score.getScoreListAdapter(getApplicationContext());
                        adapter.forceReload();
                        setListAdapter(adapter);
                    }
                });
            }
        }, 0, 60000);
person GiantRobot    schedule 07.01.2012
comment
Это не работает. ЧТО означает автообновление? и запустите OnUiThread. Минус - person l0gg3r; 04.03.2014
comment
Эти вопросы вряд ли уместны, l0gg3r. Он привел пример задачи, запланированной для запуска через 60 секунд в потоке пользовательского интерфейса. Любой разработчик Android должен легко разобраться в коде. - person Eran Boudjnah; 09.03.2014
comment
Но есть одно но, @GiantRobot. Этот пример больше похож на setInterval, чем на setTimeout. Изменения, необходимые для использования этого кода для setTimeout, будут следующими: изменить порядок значений (60000, 0 вместо 0, 60000) и остановить таймер в функции run(), чтобы он запускался только один раз. - person Eran Boudjnah; 09.03.2014

В библиотеке underscore-java есть метод setTimeout().

Пример кода:

import com.github.underscore.lodash.U;
import java.util.function.Supplier;

public class Main {

    public static void main(String[] args) {
        final Integer[] counter = new Integer[] {0};
        Supplier<Void> incr =
                () -> {
                    counter[0]++;
                    return null;
                };
        U.setTimeout(incr, 100);
    }
}

Функция будет запущена через 100 мс с новым потоком.

person Valentyn Kolesnikov    schedule 04.04.2016

В качестве продолжения ответа Валентина с использованием подчеркивания java:

Добавьте зависимость в gradle:

dependencies {
    compile group: 'com.github.javadev', name: 'underscore', version: '1.15'
}

Ява:

import com.github.underscore.lodash.$;

$.setTimeout(new Function<Void>() {
    public Void apply() {
        // work
        return null;
    }
}, 1000); // 1 second
person noamtcohen    schedule 22.06.2016