web-dev-qa-db-fra.com

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

J'ai un AsyncTask, qui remplit une liste personnalisée avec des données analysées à partir d'Internet. 

Dans PostExecute, je remplis cette liste et la prépare pour la transférer dans 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));


}

où contexte

    private Context context;

Après avoir exécuté ce code dans LogCat, je reçois une exception Java.lang.NullPointerException . Est-ce possible et correct de démarrer une activité comme je le fais?

UPD J'ai ajouté

    private Context mContext;


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

initialiser le contexte et appeler 

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

Après cela, dans PostExecute

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

J'ai ajouté un nouveau drapeau à cause de la prochaine entrée dans LogCat:

* L'appel de startActivity () en dehors d'un contexte d'activité nécessite l'indicateur FLAG_ACTIVITY_NEW_TASK. Est-ce vraiment ce que vous voulez? *

Ai-je raison?

19
Eugene Shmorgun

Vous devez passer dans le contexte de l'application plutôt que dans un contexte de l'activité locale. C'est à dire. utilisez context.getApplicationContext () et enregistrez-le dans une variable locale de votre sous-classe AsyncTask.

Le code pourrait ressembler à quelque chose comme ça:

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

tu l'appellerais comme ça:

   new MyAsyncTask(context).execute();
42
dhaag23

J'ai essayé ceci tout à l'heure ... ça marche dans la méthode PostExecute !!!

Intent intent_name = new Intent();
intent_name.setClass(getApplicationContext(),DestinationClassName.class);
startActivity(intent_name);
18
user2162383

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

Cela éliminera la possibilité que la réponse d'erreur appelle la nouvelle intention.

Exemple si l'activité précédente était supposée renvoyer Succesfully ... ou Welcome pour permettre le démarrage de la nouvelle intention, vous pouvez le vérifier de cette manière.

  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
eLi