Bonjour,

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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
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...

Merci d'avance pour votre aide !