pelotas - mover imagenes con hilos en java
Ejecutar mensajes del manejador en un hilo de fondo (4)
No está claro a qué te refieres con Handler
.
Parece que necesita un hilo que se alimenta de procesos para que se ejecute en una cola. Probablemente se beneficiaría de la investigación de los Executor
here pero aquí hay un par simple de dos hilos que se comunica a través de una cola.
public class TwoThreads {
public static void main(String args[]) throws InterruptedException {
System.out.println("TwoThreads:Test");
new TwoThreads().test();
}
// The end of the list.
private static final Integer End = -1;
static class Producer implements Runnable {
final Queue<Integer> queue;
public Producer(Queue<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
try {
for (int i = 0; i < 1000; i++) {
queue.add(i);
Thread.sleep(1);
}
// Finish the queue.
queue.add(End);
} catch (InterruptedException ex) {
// Just exit.
}
}
}
static class Consumer implements Runnable {
final Queue<Integer> queue;
public Consumer(Queue<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
boolean ended = false;
while (!ended) {
Integer i = queue.poll();
if (i != null) {
ended = i == End;
System.out.println(i);
}
}
}
}
public void test() throws InterruptedException {
Queue<Integer> queue = new LinkedBlockingQueue<>();
Thread pt = new Thread(new Producer(queue));
Thread ct = new Thread(new Consumer(queue));
// Start it all going.
pt.start();
ct.start();
// Wait for it to finish.
pt.join();
ct.join();
}
}
Quiero ejecutar Runnable en un hilo de fondo. Quiero usar Handler porque es conveniente para retrasos. Lo que quiero decir es
handler.post(runnable, delay);
Donde ejecutable debe ejecutarse en el hilo de fondo . ¿Es posible crear dicho controlador? ¿Hay algún Looper "de fondo" en alguna parte o cómo puedo crearlo?
PD: Sé cómo hacerlo con una clase personalizada extends Thread, pero requiere un poco más de esfuerzo de codificación que hacerlo de manejador. Así que por favor no publique otras soluciones o algo así como
handler.post(new Runnable() {
@Override
public void run() {
new Thread() {
@Override
public void run() {
//action
}
}.start();
}
});
Simplemente deambulo si Handler puede hacerlo de la manera "limpia".
Puede configurar un Looper en una Looper.prepare()
fondo usando Looper.prepare()
y Looper.loop
.
Puedes probar algo como esto
private void createHandler() {
Thread thread = new Thread() {
public void run() {
Looper.prepare();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Do Work
handler.removeCallbacks(this);
Looper.myLooper().quit();
}
}, 2000);
Looper.loop();
}
};
thread.start();
}
Simplemente puede hacer esto:
private Handler mHandler = null;
private HandlerThread mHandlerThread = null;
public void startHandlerThread(){
mHandlerThread = new HandlerThread("HandlerThread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
}
Luego invoque con:
handler.postDelayed(new Runnable(),1000);