Ответы:
Как всегда с Android, есть много способов сделать это, но если вы просто хотите запустить фрагмент кода немного позже в том же потоке, я использую это:
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
Log.i("tag", "This'll run 300 milliseconds later");
}
},
300);
.. это в значительной степени эквивалентно
setTimeout(
function() {
console.log("This will run 300 milliseconds later");
},
300);
MyActivityName.this.myFunctionOnActivity()
Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);
и если вы хотите отменить это:timeout.removeCallbacks(r);
setInterval ()
функция, которая повторяется каждые n миллисекунд
Javascript
setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);
Приблизительный эквивалент Java
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
Log.i("tag", "A Kiss every 5 seconds");
}
},0,5000);
SetTimeout ()
функция, которая работает только через n миллисекунд
Javascript
setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);
Приблизительный эквивалент Java
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
Log.i("tag","A Kiss after 5 seconds");
}
}, 5000);
scheduleAtFixedRate
метода, как вы отмените таймер внутри действия после его завершения?
Если вас не беспокоит разбудить телефон или вернуть приложение из мертвых, попробуйте:
// Param is optional, to run task on UI thread.
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
// Do the task...
handler.postDelayed(this, milliseconds) // Optional, to repeat the task.
}
};
handler.postDelayed(runnable, milliseconds);
// Stop a repeating task like this.
handler.removeCallbacks(runnable);
В зависимости от того, чего вы действительно хотите достичь, вам следует взглянуть на обработчики Android:
http://developer.android.com/reference/android/os/Handler.html
Если вы ранее использовали javascript setTimeout () и т. Д. Для планирования задачи, которая будет запускаться в будущем, это способ сделать это в Android (postDelayed / sendMessageDelayed).
Обратите внимание, что ни обработчики, ни таймеры не выводят телефон Android из спящего режима. Другими словами, если вы хотите запланировать что-то, что действительно произойдет, даже если экран выключен / процессор спит, вам также необходимо проверить AlarmManager.
Я не очень разбираюсь в JavaScript, но думаю, что таймеры могут быть тем, что вы ищете.
http://developer.android.com/reference/java/util/Timer.html
По ссылке:
One-shot запланированы на абсолютное время или после относительной задержки. Повторяющиеся задачи планируются либо с фиксированным периодом, либо с фиксированной ставкой.
Первый ответ, безусловно, правильный, и именно на нем я основал эту лямбда-версию, которая намного короче по синтаксису. Поскольку Runnable имеет только 1 метод переопределения run (), мы можем использовать лямбда:
this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
import java.util.Timer;
import java.util.TimerTask;
class Clock {
private Timer mTimer = new Timer();
private int mSecondsPassed = 0;
private TimerTask mTask = new TimerTask() {
@Override
public void run() {
mSecondsPassed++;
System.out.println("Seconds passed: " + mSecondsPassed);
}
};
private void start() {
mTimer.scheduleAtFixedRate(mTask, 1000, 1000);
}
public static void main(String[] args) {
Clock c = new Clock();
c.start();
}
}
Вот эквивалент setTimeout, наиболее полезный при попытке обновить пользовательский интерфейс после задержки.
Как вы, возможно, знаете, обновление пользовательского интерфейса может быть выполнено только из потока пользовательского интерфейса. AsyncTask делает это за вас, вызывая свой метод onPostExecute из этого потока.
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// Update the User Interface
}
}.execute();
onProgressUpdate()
также можно использовать для моделирования setInterval()
. 2. AsyncTask
работает в пуле потоков (или только в одном потоке), поэтому a. возможно, придется подождать, пока AsyncTask
закончит другой ; б . он займет один поток из пула.
Я создавал mp3-плеер для Android, я хотел обновлять текущее время каждые 500 мс, поэтому я сделал это так
private void update() {
new android.os.Handler().postDelayed(new Runnable() {
@Override
public void run() {
long cur = player.getCurrentPosition();
long dur = player.getDuration();
currentTime = millisecondsToTime(cur);
currentTimeView.setText(currentTime);
if (cur < dur) {
updatePlayer();
}
// update seekbar
seekBar.setProgress( (int) Math.round((float)cur / (float)dur * 100f));
}
}, 500);
}
который рекурсивно вызывает тот же метод
Котлин:
Вы также можете использовать CountDownTimer:
class Timer {
companion object {
@JvmStatic
fun call(ms: Long, f: () -> Unit) {
object : CountDownTimer(ms,ms){
override fun onFinish() { f() }
override fun onTick(millisUntilFinished: Long) {}
}.start()
}
}
}
И в вашем коде:
Timer.call(5000) { /*Whatever you want to execute after 5000 ms*/ }