14 votes

Terminer l'activité d'appel lorsque AsyncTask est terminé

Mon activité en cours d'appel :

public class Hello extends Activity {  

public void onCreate(Bundle savedInstanceState) {

    MyTask mt = new MyTask(this);
    mt.execute();
}

Maintenant dans MyTask (une classe externe) :

public class MyTask extends AsyncTask {
private Context mContext;

public MyTask(Context context) {

    mContext = context;
}  

//doinbackground, etc

    protected void onPostExecute() {
    mContext.finish();

}

Les autres fonctionnent comme prévu si je supprime mContext.finish() ci-dessus.
Mais si j'appelle mContext.finish(), je reçois une erreur : La méthode finish() n'est pas définie pour le type Context (Eclipse ne montre pas finish() lorsque j'écris mContext, ce qui suggère que j'utilise finish() de manière incorrecte.)

Que dois-je faire pour terminer l'activité en cours d'appel Hello après que MyTask ait terminé la tâche ?

23voto

Squonk Points 28943
((Activité)mContext).finish();

Serait la bonne façon de convertir un Context en une Activité et d'appeler sa méthode finish(). Pas sûr pourquoi vous voudriez terminer une Activité à partir d'une TâcheAsynchrone cependant

19voto

Necronet Points 3212

Que pouvez-vous essayer de faire au lieu d'appeler context.finish(), pourquoi ne pas utiliser une interface de rappel comme ceci :

public interface TaskCallback{
void done();
}

Ensuite, vous implémentez cela dans votre Activité

public Hello extends Activity implements TaskCallback{

    .....BUNCH OF ACTIVITY CODE.....

public void onCreate(Bundle savedInstanceState) {

    MyTask mt = new MyTask(this);
    mt.execute();
}

public void done() {
     finish();
}

}

Et au lieu d'avoir Context comme paramètre, vous avez TaskCallback

public class MyTask extends AsyncTask {
private TaskCallback mCallback;

public MyTask(TaskCallback callback) {

    mCallback = callback;
}  

//doinbackground, etc

    protected void onPostExecute() {
    mCallback.done();

}

Voilà, cela vous donne plus de flexibilité pour personnaliser chaque implémentation.

3voto

desu sudarsana Points 47

J'ai eu la même situation, alors je fais ce qui suit :

public class MyTask extends AsyncTask {
private Activity mActivity;
private Context mContext;

public MyTask(Activity activity) {
    mActivity = activity;
    mContext = mActivity.getApplicationContext();
}  

//doinbackground, etc

protected void onPostExecute() {
    mActivity.finish();

}

J'espère que cela aide :)

2voto

Neeraj Points 31

Définissez une méthode dans votre classe d'activité comme ceci :

public void FinishAfterAsyncTask()
{
   this.finish();
}

Et appelez cette méthode depuis la méthode OnPostExecute de la classe AsynTask.

1voto

rubdottocom Points 1551

Vous pourriez créer un nouveau AsyncTask privé étendu à partir de celui public.

Dans ce AsyncTask privé, vous avez accès aux éléments de l'Activity et vous pouvez remplacer la méthode onPostExecute pour le terminer.

Votre vrai AsyncTask

public class MyPublicAsyncTask extends AsyncTask {
    Context context;
    public GetHorariosAsyncTask(Context ctx){
        context = ctx;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // préparez-vous pour un travail asynchrone
    }
    @Override
    protected Void doInBackground(Void... params) {
        // Faites vos trucs asynchrones cool
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
       // vous avez terminé, informons l'utilisateur
    }
}

Votre activité avec AsyncTask privé

public class MyActivity  extends Activity {
    Activity mAct;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mAct = this;
    }

    private class MyPrivateAsyncTask extends MyPublicAsyncTask {

        public MyPrivateAsyncTask(Context ctx) {
            super(ctx);
            // TODO - constructeur généré automatiquement
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO - méthode générée automatiquement
            super.onPostExecute(result);
            // notre tâche asynchrone est terminée ! occupons-nous de cette activité
            mAct.finish();
        }

    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X