2010-09-26 7 views
2

Je demande des informations à partir d'un service Web dans mon application Android. Le service Web renvoie une liste d'éléments, chaque élément ayant une image base64 et quelques informationsAppel de service Web fileté

Première méthode: accédez simplement au service Web et obtenez le résultat. Cela signifie un blocage de l'interface utilisateur jusqu'à ce que les données soient téléchargées. Pas une bonne solution

Deuxième méthode: mettre le téléchargement de données dans un fil, et afficher une barre de progression avec un message.

private void StartGettingData() 
    { 
     viewInfo = new Runnable(){ 
      public void run() { 
       getData(); //from the web service 
      } 
     }; 
     Thread thread = new Thread(null, viewInfo, "MagentoBackground"); 
     thread.start(); 
     progressDialog = ProgressDialog.show(TracksListActivity.this,  
       "Please wait...", "Retrieving data from WEB...", true); 
    } 

    private void getData(){ 
    { 
     get data from web service into a list and then 

     runOnUiThread(returnRes); 
    } 

    private Runnable returnRes = new Runnable() { 

    public void run() { 
     populate the listview adapter with info from the web service result list and 

     progressDialog.dismiss(); 
     generalTrackInfoAdapter.notifyDataSetChanged(); 
    } 
}; 

Ceci montre une belle image et le message. L'utilisateur devra attendre que tout le téléchargement soit terminé. Je ne sais pas comment annuler le thread getdata().

Troisième méthode: Je voudrais avoir quelque chose comme, l'utilisateur appuie sur un bouton pour obtenir des données, un fil télécharge élément par élément du service Web et l'affiche immédiatement dans la liste. L'utilisation peut toujours annuler la demande en appuyant sur un bouton.

Mais, comment faire? Ou y a-t-il un autre moyen?

Répondre

3

Vous pouvez utiliser AsyncTask pour le filetage, notions de base: painless threading, par exemple: Multithreading For Performance(image downloader). Parce que l'utilisation du thread de classe ou de l'interface exécutable votre code devient plus compliqué et plus difficile à lire. Cela devient encore pire lorsque vous implémentez des opérations complexes nécessitant des mises à jour fréquentes de l'interface utilisateur.

Le but d'AsyncTask est de prendre soin de la gestion des threads pour vous.

La structure de base est:

public class DownloaderTask extends AsyncTask<String, String, String>{ 

    protected void onPreExecute(){} 

    protected String doInBackground(String....args){ 
     //do something in background 
    } 

    protected void onProgressUpdate(String str){} 

    protected void onPostExecute(String result){ 
     //..update ui 
    } 
} 

... pour commencer votre tâche par exemple:

public void onClick(View v){ 
    new DownloaderTask().execute("param"); 
} 
  • La méthode doInBackground() exécute automatiquement sur un thread de travail

  • onPreExecute(), onPostExecute() et onProgressUpdate() sont tous invoqué sur le thread d'interface utilisateur

  • La valeur retournée par doInBackground() est envoyé à onPostExecute()

  • Vous pouvez appeler publishProgress() à à tout moment dans doInBackground() à exécuter onProgressUpdate() sur le thread UI

  • Vous pouvez annuler la tâche à tout moment, de tout fil