Dans une application Android, je souhaite lancer au démarrage d'une activity une asyncTask qui avant et après son exécution doit mettre à jour des éléments de l'actionBar. Le programme a cependant un comportement "étrange".
Mon asyncTask modifiant la visibilité d'un MenuItem, je le fais passer en paramètre de cette dernière. Mon asyncTask doit donc être lancée après l'initialisation du menu, c'est à dire après l'appelle à la méthode onCreateOptionsMenu().
Voici donc à quoi ressemble mon activity :
public class MaView extends SherlockActivity {
private MenuItem itemRefresh;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_apropos);
//ActionBar
final ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
setSupportProgressBarIndeterminateVisibility(false);
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
final MenuInflater menuInflater = getSupportMenuInflater();
menuInflater.inflate(R.layout.menu_news, menu);
itemRefresh = menu.findItem(R.id.menuNewsRefreshItem);
itemRefresh.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
updateFunction();
return true;
}
public void updateFunction() {
new MaTask(MaView.this, getSherlock(), itemRefresh).execute();
}
}
et le code mon asyncTask :
public class MaTask extends AsyncTask<Void, Integer, Boolean> {
private static final String TOAST_MAJ_EN_COURS = "Mise à jour de la base de données en cours";
private static final String TOAST_ERR_MAJ = "Une erreur est survenue pendant la mise à jour de la base de données";
private Context context;
private ActionBarSherlock actionBar;
private MenuItem item;
public NewsTask(final Context context, final ActionBarSherlock actionBar, final MenuItem item) {
this.context = context;
this.actionBar = actionBar;
this.item = item;
}
@Override
protected void onPreExecute() {
Toast.makeText(context, TOAST_MAJ_EN_COURS, Toast.LENGTH_SHORT).show();
item.setVisible(false);
actionBar.setProgressBarIndeterminateVisibility(true);
}
@Override
protected Boolean doInBackground(Void... params) {
//execution de la tâche
return true;
}
@Override
protected void onPostExecute(final Boolean result) {
actionBar.setProgressBarIndeterminateVisibility(false);
item.setVisible(true);
if(!result) {
Toast.makeText(context, TOAST_ERR_MAJ, Toast.LENGTH_SHORT).show();
}
}
}
Le problème avec le code précédent, c'est qu'une fois le traitement terminé, l'appel à item.setVisible(true) ne semble pas fonctionner. En effet, mon MenuItem n'apparaît pas pour autant...
J'ai pas mal chercher et je pense que le problème vient de l'endroit ou j'appelle ma fonction updateFonction(). En effet, si je ne l'appelle pas automatiquement et que j'attends que l'utilisateur clique par exemple sur une icône du menu pour lancer l'asyncTask, tout fonctoonne parfaitement : le MenuItem disparraît pour laisser sa place à la progressBar puis revient à la fin du traitement.
Ou dois-je alors placer l'appel de ma fonction updateFonction() ? Je pense que si j'appelle ma méthode après onCreateOptionsMenu() et non dedans, le problème serait résolu, mais comment faire ? Quelle méthode est appellé après onCreateOptionsMenu() ? onCreate, onResume et onStart sont appellées avant...
Bonjour,
Est-ce que l'event onPostExecute est bien appelé ?
A la fin de l'asyncTask ? Tu peux faire un pas à pas en utilisant le debugger intégré à Eclipse.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Mon site - Mon livre sur le XML - Mon blog
Mon site - Mon livre sur le XML - Mon blog