wake-up-neo.com

progressDialog in AsyncTask

Ich versuche, während des Ladens von RSS-Feeds vom http-Server einen benutzerdefinierten Fortschrittsdialog anzuzeigen. Ich habe eine harte Suche gemacht, aber nichts half mir dabei, das einzige, was ich weiß, ist, dass die Lösung AsyncTask verwenden sollte, aber ich bin verwirrend Die Params, die an diese AsyncTask übergeben werden sollen .. Hier ist meine Aktivität:

    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);
        }
    }

}

Können Sie mir bitte dabei helfen, AsyncTask hinzuzufügen?

Danke, Houssem

63
Houssem

Fixiert durch Verschieben der Ansichtsmodifizierer in onPostExecute, sodass der feste Code wie folgt lautet:

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, danke, dass dein Code sehr hilfreich war.

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 ist sehr hilfreich!

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

Vor ein paar Tagen habe ich eine sehr schöne Lösung für dieses Problem gefunden. Lesen Sie darüber hier . In zwei Worten hat Mike einen AsyncTaskManager erstellt, der ProgressDialog und AsyncTask vermittelt. Es ist sehr einfach, diese Lösung zu verwenden. Sie müssen lediglich mehrere Schnittstellen und mehrere Klassen in Ihr Projekt aufnehmen und in Ihre Aktivität einfachen Code schreiben und Ihre neue AsyncTask aus BaseTask verschachteln. Ich empfehle Ihnen auch, Kommentare zu lesen, da es einige nützliche Tipps gibt. 

3
Yury

Es ist einige Jahre her, seit diese Frage gestellt wurde (und da jemand eine Antwort gepostet hat). Seitdem wurde ProgressDialog in der API-Ebene O gemäß der offiziellen Dokumentation von Android nicht mehr unterstützt. Daher sollten Sie einen Inline-Fortschrittsbalken anstelle eines Fortschrittsdialogs verwenden, wie von den Autoren der Dokumentation vorgeschlagen.

0

Weiß nicht, welchen Parameter ich verwenden soll?

Viele Entwickler und Entwickler haben es am Anfang schwer, eine AsyncTask zu schreiben, da die Parameter nicht eindeutig sind. Der Hauptgrund ist, dass wir versuchen, die in der AsyncTask verwendeten Parameter zu speichern. Der Schlüssel ist Nicht merken. Wenn Sie sich vorstellen können, was Ihre Aufgabe wirklich tun muss, wäre das Schreiben der AsyncTask mit der richtigen Signatur ein Kinderspiel. 

Was ist eine AsyncTask?

AsyncTask sind Hintergrundaufgaben, die im Hintergrundthread ausgeführt werden. Es nimmt eine Eingabe, führt Fortschritt aus und gibt Ausgabe aus.

dh AsyncTask<Input,Progress,Output>

Finden Sie einfach heraus, was Ihre Eingabe, Ihr Fortschritt und Ihre Ausgabe sind, und Sie werden gut sein.

Zum Beispiel

 enter image description here

Wie ändert sich doInbackground() mit AsyncTask-Parametern?

 enter image description here

Wie doInBackground() und onPostExecute(), onProgressUpdate() .__ sind. verbunden? 

 enter image description here

Wie kann man das in einen Code schreiben?

 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
    }

}

Wie werden Sie diese Aufgabe in Ihrer Aktivität ausführen?

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