Что является эквивалентом javascript setTimeOut() для Android?
Мне нужен эквивалентный код setTimeOut(call function(),milliseconds);
для андроида.
setTimeOut(call function(),milliseconds);
5 ответов
Вы, вероятно, хотите проверить 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);
}
Есть некоторые вещи, которые нужно знать обработчикам в вашей деятельности:
- Ваша активность может быть отключена / невидима, пока ваш обработчик все еще работает, если вы не остановите его в onStop (или onPause, если вы запустили его в onResume), это приведет к проблемам, если вы попытаетесь обновить пользовательский интерфейс
- Если ваш телефон находится в глубоком сне, обработчики не будут срабатывать так часто, как вы указали. Я знаю это, так как провел несколько обширных испытаний устройств Bluetooth для проверки возможности подключения после многих часов работы, и я использовал обработчики вместе с распечатками журналов каждый раз, когда они запускались.
- Если вам нужен этот таймер, я рекомендую включить его в службу, которая будет работать дольше, чем действие. Зарегистрируйте свою деятельность в сервисе (реализовав интерфейс, определенный в сервисе, для связи с сервисом).
Это код, который я использовал в моем текущем проекте. Я использовал 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);
В библиотеке 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 мс с новым потоком.
В качестве продолжения к ответу Валентина, используя подчеркивание 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
Более похоже на Android, чем на JavaThread
использовать Android Looper, учитывая, что теперь у вас есть доступ к Kotlin,
Handler(Looper.getMainLooper()).postDelayed({ /* action */ }, 2000)
Или, более похожий на Котлин способ использованияandroidx.core:core-ktx
расширения Kotlin, а затем,
import androidx.core.os.postDelayed
Handler(Looper.getMainLooper()).postDelayed(2000) {
// action
}
Вы можете использоватьTimeUnit.SECONDS.toMillis(2)
вместо2000
.