Activity.runOnUiThread de Android no es estático, así que ¿cómo puedo usarlo?

Por ejemplo, si tengo un hilo que hace cosas caras, y desde ese hilo quiero disparar runOnUiThread en la clase Main (actividad). Obviamente no debería hacer una instancia de mi clase de actividad (Principal). Así que si lo intento

Main.runOnUiThread(mRunnable); 

De mi hilo me da un error diciendo que no es un método estático, y por lo tanto no se puede acceder en mi camino. Ahora mi comprensión sería que la clase de actividad casi se accede casi de una manera estática.
¿Cómo haría esto?

(Btw: Estoy haciendo esto porque estaba recibiendo CalledFromWrongThreadException, sólo el hilo original que creó una jerarquía de vista puede tocar sus vistas )

Debe utilizar la clase Handler . La clase de controlador se ejecuta en el subproceso de interfaz de usuario. Cuando termine de trabajar en su hilo, llame a handler.sendEmptyMessage() , desde donde puede realizar los cambios en su ui.

 private final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { // make changes to ui } } 

Su pregunta realmente no proporciona suficientes detalles, pero por el sonido de las cosas, usted está en una clase interna privada (Runnable?) En su actividad (Principal). Si ese es el caso, puede escribir:

 Main.this.runOnUiThread(mRunnable); 

o

 runOnUiThread(mRunnable); //will see that there is no runOnUiThread in the current class and begin looking "upwards" 

Además, es posible que desee ver AsyncTask , específicamente en el onPostExecute , onPreExecute y onProgressUpdate callbacks, que se ejecutan en el subproceso de interfaz de usuario.

Raunak tiene la idea correcta. Voy a añadir que también puede especificar un número entero en el método sendEmptyMessage como un identificador para el manejador. Esto le permitirá crear un controlador que puede manejar todas sus actualizaciones de interfaz de usuario, por ejemplo

 public static final int EXAMPLE = 0; public static final int ANOTHER_EXAMPLE = 1; private final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch( msg.what ){ case EXAMPLE: //Perform action break; case ANOTHER_EXAMPLE; //Perform action break; } } } //Call to submit handler requesting the first action be called handler.sendEmptyMessage(EXAMPLE); 

¡Espero que esto ayude!

En primer lugar crear un runnable fuera onCreate. Me gusta esto:

 private Runnable myRunnable = new Runnable() { @Override public void run() { //work to be done } }; 

Y luego llamar al runnable usando:

 runOnUiThread(myRunnable); 

Todas las respuestas anteriores no son muy correctas.

1) si desea que un pedazo de código se ejecute en el subproceso de interfaz de usuario de cualquier base de código de subproceso. Usted puede hacer: Looper.getMainLooper (). Post (new Runnable (…))

Porque Looper.getMainLooper () es una variable estática e inicializada en ActivityThread.

2) si su fragmento de código ejecutable está dentro de una actividad, puede utilizar:

MainActivity.this.runOnUiThread (…)

Para aquellos que buscan una solución instantánea fácil, siga los sencillos pasos

  • Haga una referencia de su clase antes de su método onCreate()

     MyClass obj; 
  • Inicializarlo en su método onCreate()

     obj = MyClass.this; 
  • Llamada runOnUiThread()

     obj.runOnUiThread(new Runnable() { public void run() { //perform your UI tasks here } }); 

Espero eso ayude.

  • ¿Cuál es el ciclo de vida de una variable pública estática en Android?
  • NDK: enlace estático libm
  • Variable estática null al volver a la aplicación
  • ¿Debo usar estática o getters / setters?
  • Ciclo de vida del objeto estático de Android
  • Fuga de memoria estática con contexto
  • Métodos estáticos vs. clase extendiendo android.app.Application?
  • ¿Usando métodos estáticos en Android?
  • Manejo de varias instancias de appwidget
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.