2010-10-25 5 views
0

Solution éléganteSolution élégante?

Hey People. Je travaille actuellement sur un projet et je pense à une solution élégante pour la mise en œuvre, j'en ai marre des solutions improvisées.

Permettez-moi d'expliquer mon « problème » pour vous:

La tâche de cette partie de mon application est assez simple:

Je veux que mon application pour télécharger des trucs et traiter ce fichier téléchargé en l'arrière-plan, affichant un ProgressDialog dans l'intervalle. Après cela, le contenu doit être renvoyé dans une liste de chaînes qui sont affichées dans certaines ListActivity. Jusqu'à présent, pas une grosse affaire:

Téléchargeur et le traitement est un AsyncTask sous-classé et appelé dans une classe différente de l'activité principale. Mais maintenant mon problème:

Où appeler le Progressdialog? Et comment le thread graphique peut-il "réagir" avec un ProgressDialog? Dois-je appeler le ProgressDialog de la classe de traitement ou est-il préférable de "bloquer" la classe principale, en attendant une notification?

Salutations

EnflamedSoul

+1

Avez-vous regardé un modèle appelé 'Observer Pattern'? –

Répondre

0

Définir votre dialogue Progess en tant que variable globale.

ProgressDialog pd; 

Où vous allez tirer au large de la AsyncTask:

showYourProgressDialog; 
thread = new aThread().execute(); 

Dans votre classe:

public class aThread extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... args) { 
      try { 
       //Do your downloading and stuff 
           asyncHandler.sendMessage(asyncHandler.obtainMessage(0)); 
      } catch (Exception e) { 
       Log.e("1", "Error", e); 
      } 
      return null; 
     } 
    } 

Handler asyncHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      pd.dismiss(); 
      if (msg.what == 0) { 
       //update what you need to    
      }   
     } 
    }; 
+0

Eh bien, merci, cela m'a donné une bonne idée de ce qu'il faut faire! – EnflamedSoul

2

blindstuffs anwser va dans la bonne direction, bien que je ne voudrais pas utiliser un gestionnaire pour gérer la progression de la mise à jour. AsyncTask a ses propres fonctions pour gérer ce qui sont AMHA beaucoup plus facile à utiliser et adapter plus dans la classe AsyncTask

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
    int count = urls.length; 
    long totalSize = 0; 
    for (int i = 0; i < count; i++) { 
     totalSize += Downloader.downloadFile(urls[i]); 
     publishProgress((int) ((i/(float) count) * 100)); 
    } 
    return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

Cet exemple est tiré de la official Android SDK documentation. L'avantage d'utiliser publishProgress est que vous pouvez transmettre plus d'une valeur, en fonction du nombre d'arguments passés dans doInBackground (c'est-à-dire si vous téléchargez plus d'un fichier).

+0

Merci, ça m'a vraiment aidé. J'ai foiré quelque chose avant, mais je pense que maintenant j'ai une bonne solution. Merci! – EnflamedSoul

Questions connexes