Comment démarrer correctement l'activité de PostExecute dans Android?

j'ai un AsyncTask, qui remplit une liste personnalisée avec des données analysées sur Internet.

Dans PostExecute-je remplir cette Liste et d'obtenir qu'il soit prêt à le transférer à une nouvelle Activité.

je le fais de cette façon:

@Override
protected void onPostExecute(List<VideoDataDescription> result) 
{
    super.onPostExecute(result);
    MainActivity.progressDialog.dismiss();

    context.startActivity(new Intent(context, ResultsQueryActivity.class));


}

contexte

    private Context context;

dans LogCat après avoir exécuté ce code, j'obtiens un Java.lang.NullPointerException. Est-ce possible et correct de commencer une activité comme je le fais?

UPD J'ai ajouté

    private Context mContext;


public YoutubeAndYahooParser(Context context) 
{
    super();
    this.mContext = context;
}

pour initialiser le contexte et appeler

YoutubeAndYahooParser youtubeAndYahooParser = new YoutubeAndYahooParser(ResultsQueryActivity.this);
                    youtubeAndYahooParser.execute("my string to pass in asynctak");

Après cette PostExecute

Intent intent = new Intent(mContext, ResultsQueryActivity.class);
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 mContext.startActivity(intent);    

j'ai ajouté un nouveau drapeau parce que J'ai obtenu dans LogCat le suivant:

*appeler startActivity () de l'extérieur d'un contexte D'activité nécessite L'option FLAG_ACTIVITY_NEW_TASK. Est-ce vraiment ce que vous voulez?*

Ai-je raison?

18
demandé sur Kheldar 2012-02-02 22:41:02

3 réponses

vous devez passer dans le contexte de l'application plutôt que dans un contexte de l'activité locale. I. e. contexte d'utilisation.getApplicationContext () et enregistrez cela dans une variable locale de votre sous-classe AsyncTask.

Le code pourrait ressembler à ceci:

public class MyAsyncTask extends AsyncTask {

    Context context;
    private MyAsyncTask(Context context) {
        this.context = context.getApplicationContext();
    }

    @Override
    protected Object doInBackground(Object... params) {
        ...
    }

    @Override
    protected void onPostExecute(List<VideoDataDescription> result) {
        super.onPostExecute(result);
        MainActivity.progressDialog.dismiss();

        context.startActivity(new Intent(context, ResultsQueryActivity.class));
    }
}

vous souhaitez appeler comme ceci:

   new MyAsyncTask(context).execute();
39
répondu dhaag23 2012-02-02 23:10:33

j'ai essayé tout à l'heure ... il fonctionne dans la méthode Postexécute!!!

Intent intent_name = new Intent();
intent_name.setClass(getApplicationContext(),DestinationClassName.class);
startActivity(intent_name);
18
répondu 2013-03-16 12:25:58

mais c'est mieux si vous commencez une nouvelle intention basée sur la réponse(résultat) obtenue des activités précédentes.

ceci éliminera la possibilité que la réponse d'erreur n'invoque la nouvelle intention.

Exemple si l'activité précédente devait retourner Avec succès... ou Bienvenue pour permettre à la nouvelle intention de démarrer, j'ai pu le vérifier de cette façon

  protected void onPostExecute(String result) {
       if (result.equals("Succesfully...")){
           context.startActivity(new Intent(context, Login_Activity.class));
           Toast.makeText(context, result, Toast.LENGTH_LONG).show();


       }else  if (result.contains("Welcome")){
           context.startActivity(new Intent(context, MainActivity.class));
       }else {
           Toast.makeText(context,result,Toast.LENGTH_LONG).show();
       }

    }
0
répondu eLi 2018-06-26 19:39:58