thread runonuithread handlemessage java android

java - handlemessage - thread runonuithread



ejecutando runOnUiThread en una clase separada (3)

Posible duplicado:
Android cómo ejecutarOnUiThread en otra clase?

Mis clases de Asyn son un archivo de clase separado.

public class AdamTask extends AsyncTask<String, Void, String>{ public void showToast(final String toast) { runOnUiThread(new Runnable() { public void run() { Toast.makeText(context, toast, Toast.LENGTH_SHORT).show(); } }); } }

¿Cómo ejecutaría este método en mi clase de AsyncTask? Recibo un error. El método runOnUiThread(new Runnable(){}) is undefined for the type AdamTask

nueva AdamTask (Eve.this, How to pass the eve activity here ) .execute ();


Necesitas tu objeto Activity para hacer esto. Pase esta referencia de su Actividad a través del constructor y utilícela en su AsyncTask.

public class AdamTask extends AsyncTask<String, Void, String>{ public void showToast(final String toast) { activityObj.runOnUiThread(new Runnable() { public void run() { Toast.makeText(context, toast, Toast.LENGTH_SHORT).show(); } }); } }

Dado que runOnUiThread es un método público en la clase de actividad, no puede usarlo en ninguna otra clase o clase personalizada que se extienda por otra que no sea la propia actividad.

Mira aquí, runOnUiThread

Si no está claro, marque esta answer para saber cómo enviar un objeto de actividad a través del constructor


Solo encadena el contexto a la clase de actividad

((Activity)context).runOnUiThread(new Runnable() { public void run() { Toast.makeText(context, toast, Toast.LENGTH_SHORT).show(); } });


AsyncTask tener la referencia de la Activity''s (permite nombrarla activity ) y pasarla a su clase de AsyncTask . Entonces puedes llamar a runOnUiThread así:

activity.runOnUiThread

El runOnUiThread es un método definido en la clase de Activity .

Solo agregue un constructor a su AsyncTask. Tu AsyncTask se verá así:

public class AdamTask extends AsyncTask<String, Void, String> { private Activity activity; //activity is defined as a global variable in your AsyncTask public AdamTask(Activity activity) { this.activity = activity; } public void showToast(final String toast) { activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(activity, toast, Toast.LENGTH_SHORT).show(); } }); } ... }

Luego, para llamar a AsyncTask necesitas algo como esto:

AdamTask adamTask = new AdamTask(Eve.this); adamTask.excecute(yourParams);

ACTUALIZACIÓN Como lo mencionó Sam en los comentarios, AsyncTasks puede dar como resultado una fuga de context cuando se producen cambios en la configuración (un ejemplo es cuando la pantalla gira y se recrea la Activity ). Una forma de lidiar con esto es la técnica de fragment sin cabeza .

Otra forma, más eficiente, es usar un bus de eventos. Consulte here para obtener más información (enlace proporcionado por Sam en los comentarios).