Что эквивалентно javascript setTimeOut () для Android? - PullRequest
24 голосов
/ 07 января 2012

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

setTimeOut(call function(),milliseconds);

Ответы [ 4 ]

21 голосов
/ 07 января 2012

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

Поскольку вы подняли этот вопрос снова, я хотел бы дать другую рекомендацию, а именно Handler .Его проще использовать, чем 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. Если вам нужен этот таймер, чтобы он работалЯ рекомендую поместить это в сервис, который продлится дольше чем деятельность.Зарегистрируйте свою деятельность в службе (реализуя интерфейс, определенный в службе для связи со службой).
11 голосов
/ 07 января 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);
1 голос
/ 22 июня 2016

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

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

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

Java:

import com.github.underscore.lodash.$;

$.setTimeout(new Function<Void>() {
    public Void apply() {
        // work
        return null;
    }
}, 1000); // 1 second
1 голос
/ 04 апреля 2016

В библиотеке underscore-java есть метод setTimeout (). Я поддерживаю проект.

Пример кода:

import com.github.underscore.lodash.U;
import com.github.underscore.Function;

public class Main {

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

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

...