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).