Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] ActionBar et AsyncTask

Sujet résolu
    14 décembre 2012 à 15:55:38

    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 :


    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...

    Merci d'avance pour votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      15 décembre 2012 à 11:46:46

      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.
      • Partager sur Facebook
      • Partager sur Twitter
        15 décembre 2012 à 16:13:54

        Bonjour,

        Oui la méthode est bien appelé et visiblement je ne suis pas le seul à avoir ce problème : http://stackoverflow.com/questions/136 [...] to-false-then

        En fait l'entére du menu apparaît bien mais via le bouton "menu" du téléphone et non dans l'actionBar.

        Mais bon, finalement via la méthode setActionView() de l'icône je me suis débrouillé autrement.
        • Partager sur Facebook
        • Partager sur Twitter

        [Android] ActionBar et AsyncTask

        × 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.
        • Editeur
        • Markdown