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