2011-08-15 14 views
23

Quiero preformar un Toast cuando se completa una tarea en segundo plano, solo para que el usuario sepa que ha finalizado.¿Cómo paso un contexto a una AsyncTask?

He hecho una nueva clase para mi asyncTask pero no puedo usar getApplicationContext() dentro de esta clase.

Estoy usando task.execute(getTempFile(this), getApplicationContext()); para ejecutar las tareas. getTempFile devuelve un objeto File e intentaba pasar el contexto como un objeto Context.

Mi clase de tarea tiene 3 variables AsyncTask<Object, Integer, Integer> por lo que el contexto está en el segundo objeto. Sin embargo, esto bloquea la aplicación.

Editar

public class LocationActivity extends Activity implements LocationListener { 
    protected void handleImage(Bitmap thumbnail){ 
     PushDataToServer task = new PushDataToServer(); 
     task.execute(getTempFile(this), getApplicationContext()); 
    } 
} 




public class PushDataToServer extends AsyncTask<Object, Integer, Integer> { 

    Context context; 

    @Override 
    protected Integer doInBackground(Object... params) { 
     // TODO Auto-generated method stub 
     this.context = (Context) params[1]; 
     File file = (File) params[0]; 
     return null; 
    } 

    protected void onPostExecute(String result) { 
     Toast toast = Toast.makeText(this.context, "All done!", Toast.LENGTH_SHORT); 
     toast.show(); 
    } 

} 
+0

Por favor, puesto que su clase AsyncTask y el esqueleto de su clase principal :) – Codeman

+0

Actualicé mi pregunta con el código de muestra. – dotty

Respuesta

75

Pase un objeto Context en el constructor AsyncTask.

Código de ejemplo:

public class MyTask extends AsyncTask<?, ? ,?> { 
    private Context mContext; 

    public MyTask(Context context) { 
     mContext = context; 
    } 
} 

y luego, cuando usted está construyendo su AsyncTask:

MyTask task = new MyTask(this); 
task.execute(...); 
+0

El pan tostado nunca se muestra. ¿Alguna otra idea? – dotty

+0

El 'Toast' se debe mostrar cuando se está llamando a' show() 'en las funciones que se ejecutan en el subproceso de la interfaz de usuario. ¿Estás seguro de que este es el caso? – Wroclai

+0

El brindis está en mi método onPostExecute(). La muestra del código está arriba. – dotty

0

Usted dice que su contexto es en el segundo objeto, sin embargo, su segundo objeto es entero. ¿Podría ser este tu problema? Además, otra sugerencia es colocar tu clase AsyncTask como una clase interna privada para tu actividad, de esa manera estoy bastante seguro de que tendrás acceso a getApplicationContext().

2

Páselo en el constructor, no como un parámetro de método. Entonces no necesita depender de los parámetros genéricos.

Cuestiones relacionadas