web-dev-qa-db-fra.com

progressDialog in AsyncTask

J'essaie d'afficher un journal de progrès personnalisé lors du chargement du flux RSS à partir du serveur http. J'ai fait une recherche difficile, mais rien ne m'a aidé à le faire. La seule chose que je sache, c'est que la solution doit utiliser AsyncTask. les paramètres à passer à cette AsyncTask . Voici mon activité:

    import Java.util.ArrayList;
import Java.util.List;

import com.cyberesa.info.BaseFeedParser;
import com.cyberesa.info.Message;
import com.cyberesa.info.MessageListAdapter;
import com.cyberesa.info.R;

import Android.app.ListActivity;
import Android.os.Bundle;
import Android.util.Log;
import Android.widget.TextView;

public class Soirees extends ListActivity {
    private List<Message> messages;
    private TextView tvSorties;
    private MyProgressDialog dialog;
    @Override
    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);

        setContentView(R.layout.sorties);

        tvSorties=(TextView)findViewById(R.id.TVTitle);
        tvSorties.setText("Programme des soirées");

        loadFeed();

   }

    private void loadFeed(){
        try{
            BaseFeedParser parser = new BaseFeedParser();
            messages = parser.parse();
            List<Message> titles = new ArrayList<Message>(messages.size());
            for (Message msg : messages){
                titles.add(msg);
            }
            MessageListAdapter adapter = new MessageListAdapter(this,titles);
            this.setListAdapter(adapter);
            adapter.notifyDataSetChanged();

        } catch (Throwable t){
            Log.e("ImageLoader",t.getMessage(),t);
        }
    }

}

Pouvez-vous s'il vous plaît m'aider à ajouter AsyncTask à cela?

Merci, Houssem

63
Houssem

Fixé en déplaçant les modificateurs de vue vers onPostExecute afin que le code fixe soit:

public class Soirees extends ListActivity {
    private List<Message> messages;
    private TextView tvSorties;

    //private MyProgressDialog dialog;
    @Override
    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);

        setContentView(R.layout.sorties);

        tvSorties=(TextView)findViewById(R.id.TVTitle);
        tvSorties.setText("Programme des soirées");

        new ProgressTask(Soirees.this).execute();


   }


    private class ProgressTask extends AsyncTask<String, Void, Boolean> {
        private ProgressDialog dialog;
        List<Message> titles;
        private ListActivity activity;
        //private List<Message> messages;
        public ProgressTask(ListActivity activity) {
            this.activity = activity;
            context = activity;
            dialog = new ProgressDialog(context);
        }



        /** progress dialog to show user that the backup is processing. */

        /** application context. */
        private Context context;

        protected void onPreExecute() {
            this.dialog.setMessage("Progress start");
            this.dialog.show();
        }

            @Override
        protected void onPostExecute(final Boolean success) {
                List<Message> titles = new ArrayList<Message>(messages.size());
                for (Message msg : messages){
                    titles.add(msg);
                }
                MessageListAdapter adapter = new MessageListAdapter(activity, titles);
                activity.setListAdapter(adapter);
                adapter.notifyDataSetChanged();

                if (dialog.isShowing()) {
                dialog.dismiss();
            }

            if (success) {
                Toast.makeText(context, "OK", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "Error", Toast.LENGTH_LONG).show();
            }
        }

        protected Boolean doInBackground(final String... args) {
            try{    
                BaseFeedParser parser = new BaseFeedParser();
                messages = parser.parse();


                return true;
             } catch (Exception e){
                Log.e("tag", "error", e);
                return false;
             }
          }


    }

}

@ Vladimir, merci votre code était très utile.

43
Houssem
/**
 * this class performs all the work, shows dialog before the work and dismiss it after
 */
public class ProgressTask extends AsyncTask<String, Void, Boolean> {

    public ProgressTask(ListActivity activity) {
        this.activity = activity;
        dialog = new ProgressDialog(activity);
    }

    /** progress dialog to show user that the backup is processing. */
    private ProgressDialog dialog;
    /** application context. */
    private ListActivity activity;

    protected void onPreExecute() {
        this.dialog.setMessage("Progress start");
        this.dialog.show();
    }

        @Override
    protected void onPostExecute(final Boolean success) {
        if (dialog.isShowing()) {
            dialog.dismiss();
        }


        MessageListAdapter adapter = new MessageListAdapter(activity, titles);
        setListAdapter(adapter);
        adapter.notifyDataSetChanged();


        if (success) {
            Toast.makeText(context, "OK", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(context, "Error", Toast.LENGTH_LONG).show();
        }
    }

    protected Boolean doInBackground(final String... args) {
       try{    
          BaseFeedParser parser = new BaseFeedParser();
          messages = parser.parse();
          List<Message> titles = new ArrayList<Message>(messages.size());
          for (Message msg : messages){
              titles.add(msg);
          }
          activity.setMessages(titles);
          return true;
       } catch (Exception e)
          Log.e("tag", "error", e);
          return false;
       }
    }
}

public class Soirees extends ListActivity {
    private List<Message> messages;
    private TextView tvSorties;
    private MyProgressDialog dialog;
    @Override
    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);

        setContentView(R.layout.sorties);

        tvSorties=(TextView)findViewById(R.id.TVTitle);
        tvSorties.setText("Programme des soirées");

        // just call here the task
        AsyncTask task = new ProgressTask(this).execute();
   }

   public void setMessages(List<Message> msgs) {
      messages = msgs;
   }

}
126
Vladimir Ivanov

AsyncTask est très utile!

class QueryBibleDetail extends AsyncTask<Integer, Integer, String>{
        private Activity activity;
        private ProgressDialog dialog;
        private Context context;

        public QueryBibleDetail(Activity activity){
            this.activity = activity;
            this.context = activity;
            this.dialog = new ProgressDialog(activity);
            this.dialog.setTitle("查询经文");
            this.dialog.setMessage("正在查询:"+tome+chapterID+":"+sectionFromID+"-"+sectionToID);
            if(!this.dialog.isShowing()){
                this.dialog.show();
            }
        }

        @Override
        protected String doInBackground(Integer... params) {
            Log.d(TAG,"经文doInBackground");
            publishProgress(params[0]);

            if(sectionFromID > sectionToID){
                return "";
            }

            String queryBible = "action=query_bible&article="+chapterID+"&id="+tomeID+"&verse_start="+sectionFromID+"&verse_stop="+sectionToID+"";
            try{
                String bible = (Json.getRequest(Host+queryBible)).trim();
                bible = Android.text.Html.fromHtml(bible).toString();
                return bible;
            }catch(Exception e){
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String bible){
            Log.d(TAG,"经文onPostExecute");
            TextView bibleBox = (TextView) findViewById(R.id.bibleBox);
            bibleBox.setText(bible);
            this.dialog.dismiss();
        }
    }
8
Praise Song

Il y a quelques jours, j'ai trouvé une très bonne solution à ce problème. Lire à ce sujet ici . En deux mots, Mike a créé un AsyncTaskManager qui associe ProgressDialog et AsyncTask. C'est très facile d'utiliser cette solution. Vous devez simplement inclure dans votre projet plusieurs interfaces et plusieurs classes. Dans votre activité, écrivez un code simple et imbriquez votre nouvelle AsyncTask de BaseTask. Je vous conseille également de lire les commentaires car il existe des astuces utiles. 

3
Yury

Cela fait quelques années que cette question a été posée (et depuis que quelqu'un a posté une réponse). Depuis lors, ProgressDialog était obsolète dans le niveau 0 de l'API, selon la documentation officielle d'Android. En tant que tel, vous pouvez envisager d’utiliser une barre de progression en ligne au lieu d’un ProgressDialog comme le suggèrent les auteurs de la documentation.

0
The Great Codeini

Je ne sais pas quel paramètre dois-je utiliser?

Beaucoup de développeurs ont du mal à écrire une tâche asynchrone au début, en raison de l’ambiguïté des paramètres. La grande raison est que nous essayons de mémoriser les paramètres utilisés dans la tâche Async. La clé est ne pas mémoriser. Si vous pouvez visualiser ce que votre tâche doit réellement faire, alors écrire l'AsyncTask avec la signature correcte serait un jeu d'enfant. 

Qu'est-ce qu'une tâche asynchrone?

AsyncTask sont des tâches en arrière-plan qui s'exécutent dans le thread en arrière-plan. Il prend une entrée, effectue une progression et donne une sortie.

c'est-à-dire AsyncTask<Input,Progress,Output>

Déterminez simplement ce que sont vos intrants, vos progrès et vos résultats et vous serez prêt à partir.

Par exemple

 enter image description here

Comment doInbackground() change-t-il avec les paramètres AsyncTask?

 enter image description here

Comment doInBackground() et onPostExecute(), onProgressUpdate() sont-ils en relation? 

 enter image description here

Comment pouvez-vous écrire ceci dans un code?

 DownloadTask extends AsyncTask<String,Integer,String>{

    @Override
    public void onPreExecute(){
    }

    @Override
    public String doInbackGround(String... params)
    {
         // Download code
         int downloadPerc = // calculate that
         publish(downloadPerc);

         return "Download Success";
    }

    @Override
    public void onPostExecute(String result)
    {
         super.onPostExecute(result);
    }

    @Override
    public void onProgressUpdate(Integer... params)
    {
         // show in spinner, access UI elements
    }

}

Comment allez-vous exécuter cette tâche dans votre activité?

new DownLoadTask().execute("Paradise.mp3");
0
Rohit Singh