¿Cuál es el equivalente a un setInterval/setTimeout de JavaScript en Android/Java?
(9)
Aquí hay un equivalente a setTimeout, que resulta útil cuando se trata de actualizar la interfaz de usuario después de un retraso.
Como sabrá, la actualización de la interfaz de usuario solo puede realizarse desde el hilo de la interfaz de usuario. AsyncTask lo hace por ti llamando a su método onPostExecute desde ese hilo.
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();
¿Alguien puede decirme si existe un equivalente para setInterval / setTimeout para Android? ¿Alguien tiene algún ejemplo sobre cómo hacerlo?
Como siempre con Android, hay muchas formas de hacerlo, pero suponiendo que simplemente quieras ejecutar un fragmento de código un poco más adelante en el mismo hilo, uso esto:
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
Log.i("tag", "This''ll run 300 milliseconds later");
}
},
300);
.. esto es más o menos equivalente a
setTimeout(
function() {
console.log("This will run 300 milliseconds later");
},
300);
Dependiendo de lo que realmente desee lograr, debería echarle un vistazo a los controladores de Android:
http://developer.android.com/reference/android/os/Handler.html
Si anteriormente usó javascript setTimeout () etc para programar una tarea para ejecutarse en el futuro, esta es la forma de hacerlo de Android (postDelayed / sendMessageDelayed).
Tenga en cuenta que ni Handlers ni Timers hacen que un teléfono Android se active desde el modo de suspensión. En otras palabras, si desea programar que algo suceda realmente aunque la pantalla esté apagada / la CPU esté inactiva, también debe verificar el AlarmManager.
Estaba creando un reproductor de mp3 para Android, quería actualizar la hora actual cada 500ms, así que lo hice así
setInterval
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);
}
que llama al mismo método recursivamente
La primera respuesta es definitivamente la respuesta correcta y es de lo que basé esta versión lambda, que es mucho más corta en sintaxis. Como Runnable solo tiene 1 método de anulación "run ()", podemos usar un lambda:
this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
No sé mucho sobre JavaScript, pero creo que Timers puede ser lo que estás buscando.
http://developer.android.com/reference/java/util/Timer.html
Desde el enlace:
One-shot está programado para ejecutarse en un tiempo absoluto o después de un retraso relativo. Las tareas recurrentes se programan con un período fijo o una tasa fija.
Si no está preocupado por despertar su teléfono o recuperar su aplicación de la muerte, intente:
// 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.
hander.removeCallbacks(runnable);
setInterval ()
función que se repite en cada n milisegundos
Javascript
setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);
Aproximado Java Equivalente
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
Log.i("tag", "A Kiss every 5 seconds");
}
},0,5000);
setTimeout ()
función que funciona solo después de n milisegundos
Javascript
setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);
Aproximado Java Equivalente
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
Log.i("tag","A Kiss after 5 seconds");
}
}, 5000);
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();
}
}