Respuestas:
Como siempre con Android, hay muchas maneras de hacer esto, pero suponiendo que simplemente quieras ejecutar un fragmento de código un poco más tarde en el mismo hilo, utilizo 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);
MyActivityName.this.myFunctionOnActivity()
Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);
y si quieres cancelarlo:timeout.removeCallbacks(r);
setInterval ()
función que se repite cada n milisegundos
Javascript
setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);
Equivalente aproximado de Java
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);
Equivalente aproximado de Java
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
Log.i("tag","A Kiss after 5 seconds");
}
}, 5000);
scheduleAtFixedRate
método, ¿cómo cancela el temporizador dentro de la actividad una vez que la actividad ha terminado?
Si no le preocupa 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.
handler.removeCallbacks(runnable);
Dependiendo de lo que realmente quieras lograr, deberías echar un vistazo a los controladores de Android:
http://developer.android.com/reference/android/os/Handler.html
Si anteriormente utilizó javascript setTimeout (), etc. para programar una tarea para que se ejecute en el futuro, esta es la forma en que Android lo hace (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 algo para que suceda realmente a pesar de que la pantalla está apagada / la CPU está durmiendo, también debe consultar el AlarmManager.
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.
La primera respuesta es definitivamente la respuesta correcta y es en 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);
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();
}
}
Aquí hay un setTimeout equivalente, principalmente útil cuando se trata de actualizar la interfaz de usuario después de un retraso.
Como ya sabrás, la actualización de la interfaz de usuario solo puede hacerse desde el hilo de la interfaz de usuario. AsyncTask lo hace por usted 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();
onProgressUpdate()
también se puede utilizar para simular setInterval()
. 2. AsyncTask
ejecuta en un grupo de subprocesos (o simplemente un solo hilo), por lo que a. puede que tenga que esperar hasta que otro AsyncTask
termine; b . ocupará un hilo del grupo.
Estaba creando un reproductor de mp3 para Android, quería actualizar la hora actual cada 500 ms, así que lo hice así
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 de forma recursiva