2011-05-01 3 views
2

Je me demande comment résoudre un problème. Lorsque je démarre une activité, je télécharge des données à l'aide d'un AsyncTaskMotif d'attente des données téléchargées

Lorsque l'utilisateur sélectionne une option dans le menu, j'utilise les données mises en cache. Que se passe-t-il s'il sélectionne les options pendant le téléchargement des données? Quelle est la meilleure façon d'attendre les données sans bloquer l'interface utilisateur?

éditer: Je ne souhaite pas modifier le menu/désactiver l'option. Je veux montrer un spinner en attendant que les données terminent leur téléchargement.

Merci

+0

Envisagez de définir un indicateur isDoneDownloading sur false et cochez cette case lorsque l'utilisateur essaie d'utiliser les données du menu pour renvoyer des commentaires utiles. Définissez l'indicateur sur true dans onPostExecute. Cela n'empêchera pas l'utilisateur de faire d'autres choses dans l'interface utilisateur pendant le téléchargement des données. – JAL

Répondre

3

Désactiver/activer les éléments de la onMenuOpened():

@Override 
    public boolean onMenuOpened(int feature, Menu menu) { 
    if (menu != null) { 
     menu.getItem(INDEX_FOR_THE_MENU_ITEM).setEnabled(stuffIsAvailable); 
    } 
    return super.onMenuOpened(feature, menu); 
    } 

EDIT - montrant une boîte de dialogue de progression:

ProgressDialog dialog = new ProgressDialog(context); 
dialog.setMessage(context.getString(dialogTextResourceId)); 
dialog.show(); 

N'oubliez pas dialog.dismiss() quand vous avez terminé.

+0

C'est une solution, mais je ne veux pas changer le menu, je préférerais mettre un spinner en attendant la fin du téléchargement. Je vais mettre à jour ma question. Merci pour l'idée – Jonas

+0

Droit, alors vous pouvez montrer un ProgressDialog pendant que vous attendez. Edited la réponse. – dmon

+0

Bien sûr, mais comment puis-je détecter la fin du téléchargement? – Jonas

1

Vous pouvez appeler AsyncTask.getStatus() lorsque l'option de menu est pressée et si elle est encore en cours d'exécution, affichez le ProgressDialog.

Ensuite, dans AsyncTask.onPostExeute(), vous pouvez indiquer à votre activité que les données sont disponibles et ignorer le compteur.

+0

Et si j'ai: 1. dans main: getStatus == RUNNING. 2. Dans Asyntask; tâches termine et rejette le dialogue. 3. en main: le principal s'est tenu, et montre seulement le dialogue maintenant. Il est verrouillé pour toujours:/ – Jonas

+0

Eh bien, une fois que l'utilisateur appuie sur l'élément de menu et les données ne sont pas prêtes, que voulez-vous faire principal? Si vous voulez juste qu'il affiche un spinner pendant qu'il attend, pourquoi ne pas simplement bloquer l'interface utilisateur et démarrer le spinner dans main. Puis, quand AsyncTask se termine, il peut dire main et main peut alors rejeter le spinner et utiliser les données. – TrevorBliss

0

Exécuter une boîte de dialogue de progression non annulable lorsque le téléchargement est lancé, rejeter une fois le téléchargement terminé. Lire sur la classe ProgressDialog.

+0

Je ne veux pas bloquer l'utilisateur lors du téléchargement en arrière-plan! Il peut ne pas vouloir utiliser les données juste après le téléchargement. – Jonas

+0

@Jonas: si vous ne voulez pas désactiver les éléments de menu et ne voulez pas les rendre indisponibles (via un ProgressDialog modal), insérez une vérification de l'état de téléchargement dans les gestionnaires d'éléments de menu et faites clignoter un AlertDialog "Réessayez plus tard". –

Questions connexes