progressDialog в AsyncTask - PullRequest
       21

progressDialog в AsyncTask

63 голосов
/ 27 декабря 2010

Я пытаюсь отобразить пользовательский диалог выполнения при загрузке RSS-канала с http-сервера, я провел сложный поиск, но ничего не помогло мне сделать это, единственное, что я знаю, это то, что решение должно использовать AsyncTask, но я Я запутался в параметрах, чтобы перейти к этой AsyncTask. Вот моя деятельность:

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

}

Не могли бы вы помочь мне добавить AsyncTask к этому?

Спасибо, Houssem

Ответы [ 7 ]

127 голосов
/ 27 декабря 2010
/**
 * 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;
   }

}
43 голосов
/ 27 декабря 2010

Исправлено путем перемещения модификаторов вида в onPostExecute, поэтому фиксированный код:

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


    }

}

@ Владимир, спасибо, твой код был очень полезным.

8 голосов
/ 02 февраля 2013

AsyncTask очень полезен!

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();
        }
    }
3 голосов
/ 05 июля 2012

Пару дней назад я нашел очень хорошее решение этой проблемы. Читайте об этом здесь . В двух словах Майк создал AsyncTaskManager, который опосредует ProgressDialog и AsyncTask. Это решение очень просто использовать. Вам просто нужно включить в ваш проект несколько интерфейсов и несколько классов, а в своей деятельности написать простой код и вложить новую AsyncTask из BaseTask. Я также советую вам читать комментарии, потому что есть несколько полезных советов.

0 голосов
/ 25 января 2019

Не знаете, какой параметр мне использовать?

Многие разработчики, в том числе и начинающие, испытывают трудности с написанием AsyncTask из-за неоднозначности параметров. Основная причина в том, что мы пытаемся запомнить параметры, используемые в AsyncTask. Ключ Не запоминайте . Если вы можете визуализировать, что на самом деле нужно делать вашей задаче, то написание AsyncTask с правильной подписью было бы просто.

Что такое AsyncTask?

AsyncTask - это фоновая задача, которая запускается в фоновом потоке. Он принимает входные данные, выполняет прогресс и выдает выходные данные.

т.е. AsyncTask<Input,Progress,Output>

Просто выясните, каковы ваши Входные данные, Прогресс и Выходные данные, и вам будет хорошо идти.

Например

enter image description here

Как doInbackground() изменяется с AsyncTask параметрами?

enter image description here

Как doInBackground() и onPostExecute(), onProgressUpdate() связанные с?

enter image description here

Как написать это в коде?

 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
    }

}

Как вы будете выполнять это задание в своей деятельности?

new DownLoadTask().execute("Paradise.mp3");
0 голосов
/ 28 апреля 2017

На этот вопрос уже дан ответ, и большинство ответов здесь верны, но они не решают одну главную проблему с изменениями конфигурации.Посмотрите на эту статью https://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/, если вы хотите написать асинхронную задачу лучше.

0 голосов
/ 25 апреля 2017

Прошло несколько лет с тех пор, как этот вопрос был задан (и с тех пор, как кто-то опубликовал ответ).С тех пор ProgressDialog устарела на уровне API O, согласно официальной документации Android. Таким образом, вы можете рассмотреть возможность использования встроенного индикатора выполнения вместо ProgressDialog, как предлагают авторы документации.

...