IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

ActionBar et AsyncTask


Sujet :

Android

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 86
    Points
    86
    Par défaut ActionBar et AsyncTask
    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 !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 86
    Points
    86
    Par défaut
    Un petit complément d'information.

    En réalité, l'item réapparaît bien, mais pas dans dans l'actionBar. Il apparaît dans le menu qui s'affiche après avoir cliqué sur le bouton "menu" du téléphone.

    Dans la méthode onPostExecute() de mon asyncTask, j'ai essayé de rajouter la ligne item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); mais ça ne change rien...

    Une idée ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 86
    Points
    86
    Par défaut
    Ok, je viens de me rendre compte de mon erreur

    Au lieu de cacher mon icône pendant le chargement, je peux lui affecter un layout particulier grâce à la propriété setActionView().

    Problème résolu.

    A noter cependant que visiblement il y a quand même un problème quelque part : http://stackoverflow.com/questions/1...-to-false-then

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. AsyncTask et variables membres
    Par j0o0 dans le forum Android
    Réponses: 10
    Dernier message: 22/02/2011, 08h56
  2. Service vs AsyncTask
    Par _Xavier_ dans le forum Android
    Réponses: 2
    Dernier message: 16/02/2011, 23h12
  3. Threads (AsyncTask) et rotations d'écran
    Par j0o0 dans le forum Android
    Réponses: 9
    Dernier message: 17/01/2011, 13h22
  4. ProgressDialog - AsyncTask + Changement d'orientation
    Par Aure7780 dans le forum Android
    Réponses: 12
    Dernier message: 03/01/2011, 10h19
  5. Thread, Service, AsyncTask, Handler?
    Par androidisme dans le forum Android
    Réponses: 8
    Dernier message: 31/08/2010, 13h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo