web-dev-qa-db-fra.com

Comment puis-je passer un contexte à une AsyncTask?

Je souhaite effectuer une Toast quand une tâche en arrière-plan est terminée, histoire de faire savoir à l'utilisateur qu'elle est terminée.

J'ai créé une nouvelle classe pour ma tâche async, mais je ne peux pas utiliser getApplicationContext() dans cette classe.

J'utilise task.execute(getTempFile(this), getApplicationContext()); pour exécuter les tâches. getTempFile renvoie un objet File et j'essayais de passer le contexte en tant qu'objet Context.

Ma classe de tâches a 3 variables AsyncTask<Object, Integer, Integer> donc le contexte est dans le deuxième objet. Cependant, cela bloque l'application.

Modifier

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();
    }

}
23
dotty

Passez un objet Context dans le constructeur de AsyncTask.

Exemple de code:

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

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

et ensuite, lorsque vous construisez votre AsyncTask:

MyTask task = new MyTask(this);
task.execute(...);
76
Wroclai

Transmettez-le dans le constructeur, pas en tant que paramètre de méthode. Ensuite, vous n'avez pas besoin de dépendre des paramètres génériques.

2
Nikolay Elenkov

Exemple complet: AsyncTask réutilisable

1
Fernando JS

Vous dites que votre contexte est dans le deuxième objet, alors que votre deuxième objet est Integer. Cela pourrait-il être votre problème? En outre, une autre suggestion consiste à placer votre classe AsyncTask en tant que classe interne privée à votre activité. Ainsi, je suis sûr que vous aurez accès à getApplicationContext ().

0
Jack