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