Cómo esperar a que Android runOnUiThread para ser terminado?

Tengo un hilo de trabajo que crea un objeto runnable y llama a runOnUiThread en él, porque se ocupa de las vistas y de los controles. Me gustaría usar el resultado del trabajo del objeto ejecutable de inmediato. ¿Cómo espero que termine? No me molesta si está bloqueando.

Sólo rascar los puntos destacados

synchronized( myRunnable ) { activity.runOnUiThread(myRunnable) ; myRunnable.wait() ; // unlocks myRunable while waiting } 

Mientras tanto … en myRunnable …

 void run() { // do stuff synchronized(this) { this.notify(); } } 

Andrew respuesta es buena, creo una clase para un uso más fácil.

Implementación de interfaces:

 /** * Events for blocking runnable executing on UI thread * * @author * */ public interface BlockingOnUIRunnableListener { /** * Code to execute on UI thread */ public void onRunOnUIThread(); } 

Implementación de clase:

 /** * Blocking Runnable executing on UI thread * * @author * */ public class BlockingOnUIRunnable { // Activity private Activity activity; // Event Listener private BlockingOnUIRunnableListener listener; // UI runnable private Runnable uiRunnable; /** * Class initialization * @param activity Activity * @param listener Event listener */ public BlockingOnUIRunnable( Activity activity, BlockingOnUIRunnableListener listener ) { this.activity = activity; this.listener = listener; uiRunnable = new Runnable() { public void run() { // Execute custom code if ( BlockingOnUIRunnable.this.listener != null ) BlockingOnUIRunnable.this.listener.onRunOnUIThread(); synchronized ( this ) { this.notify(); } } }; } /** * Start runnable on UI thread and wait until finished */ public void startOnUiAndWait() { synchronized ( uiRunnable ) { // Execute code on UI thread activity.runOnUiThread( uiRunnable ); // Wait until runnable finished try { uiRunnable.wait(); } catch ( InterruptedException e ) { e.printStackTrace(); } } } } 

Usándolo:

 // Execute an action from non-gui thread BlockingOnUIRunnable actionRunnable = new BlockingOnUIRunnable( yourActivity, new BlockingOnUIRunnableListener() { public void onRunOnUIThread() { // Execute your activity code here } } ); actionRunnable.startOnUiAndWait(); 

Tal vez un poco simplista, pero un mutex hará el trabajo:

 final Semaphore mutex = new Semaphore(0); activity.runOnUiThread(new Runnable() { @Override public void run() { // YOUR CODE HERE mutex.release(); } }); try { mutex.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } 

Una solución podría ser aprovechar el FutureTask<T> Java, que tiene el beneficio de que alguien más ya ha tratado todos los posibles problemas de concurrencia para usted:

 public void sample(Activity activity) throws ExecutionException, InterruptedException { Callable<Void> callable = new Callable<Void>() { @Override public Void call() throws Exception { // Your task here return null; } }; FutureTask<Void> task = new FutureTask<>(callable); activity.runOnUiThread(task); task.get(); // Blocks } 

Incluso puede devolver un resultado del hilo principal reemplazando Void por otra cosa.

Creo que la forma más sencilla de lograr esto es usando un "CountDownLatch".

 final CountDownLatch latch = new CountDownLatch(1); runOnUiThread(new Runnable() { @Override public void run() { // Do something on the UI thread latch.countDown(); } }); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } // Now do something on the original thread 

(Creo que esta pregunta es un duplicado de " Cómo hacer que la tarea del temporizador se espere hasta que runOnUiThread se complete ")

Utilice la clase AsyncTask, sus métodos onPostExecure y onProgressUpdate se ejecutan mediante el subproceso MAIN (el subproceso de UI).

http://developer.android.com/reference/android/os/AsyncTask.html

Es la mejor manera para su caso!

Espero que esto le pueda ayudar.

  • Cómo devolver un valor de hilo en java?
  • Nuevo hilo varias veces
  • ¿Una clase anónima mantiene referencias externas vivas?
  • La actividad se vuelve a cargar cuando cambia la orientación en Android
  • Afinidad de hilo para Android
  • ¿Es posible detener un hilo cuando el usuario pulsa la tecla de retroceso?
  • ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
  • Cómo solucionar el problema de las llamadas de la biblioteca NDK que congela el subproceso de la interfaz de usuario
  • Android.os.networkonmainthreadexception dentro de un nuevo Thread
  • Hilo android sigue funcionando después de presionar el botón Atrás
  • Número máximo de hilos Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.