Как использовать AsyncTask для отображения ProgressBar и загрузки Rss - PullRequest
4 голосов
/ 28 ноября 2011

Я использую AsyncTask для отображения индикатора выполнения при загрузке новостей Rss.Потому что это мой первый раз, когда я использую asyncTask, я не знаю, правильный ли мой метод, поэтому не могли бы вы сказать мне, если он выглядит хорошо для вас? Это работает, но я хочу просто быть sute! Спасибо

public class BackgroundAsyncTask_nea extends
       AsyncTask<Void, Void, Void> {
          private ProgressDialog dialog;
        int myProgress;

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            displayRss();
             dialog.dismiss();


        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
              dialog = ProgressDialog.show(nea.this, "", "Loading. Please wait...", true);
            myProgress = 0;
        }

        @Override
         protected void onProgressUpdate(Void... values) {
          // TODO Auto-generated method stub
          //super.onProgressUpdate(values);
         }

        @Override
        protected Void doInBackground(Void... arg0) {
            // TODO Auto-generated method stub
            loadFeed();
            return null;
        }



    }

loadFeed ();

private void loadFeed(){
        try{ 
            BaseFeedParser parser = new BaseFeedParser();
            messages = parser.parse();

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


            finish();
        }
    }

displayRss ();

private void displayRss(){

        ArrayList<HashMap<String, String>> List_nea = new ArrayList<HashMap<String, String>>(messages.size());


        for (Message msg : messages){

            des.add(msg.getDescription());// keimeno
            text.add(msg.getTitle());// titlos
            url.add(msg.getLink());// link
            imgl.add(msg.getImgLink());

        HashMap<String, String> map = new HashMap<String, String>();
        map.put("name", msg.getTitle());
        map.put("date", msg.getDate());     


        List_nea.add(map);
        ListAdapter mSchedule = new SimpleAdapter(this, List_nea, R.layout.row,
                new String[] {"name", "date"}, new int[] {R.id.TextView01, R.id.TextView02});
        this.setListAdapter(mSchedule);
        }

    AnimationSet set = new AnimationSet(true);

    Animation animation = new AlphaAnimation(0.0f, 1.0f);
    animation.setDuration(400);
    set.addAnimation(animation);

    animation = new TranslateAnimation(
        Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f,
        Animation.RELATIVE_TO_SELF, -1.0f,Animation.RELATIVE_TO_SELF, 0.0f
    );

    animation.setDuration(400);
    set.addAnimation(animation);
    LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f);
    ListView listViewn = getListView();        
    listViewn.setLayoutAnimation(controller);

    }

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Для обновления индикатора выполнения необходимо выполнить вызов функции publishProgress () .Вы не делаете это нигде в вашем коде.На вашем месте я бы передал ссылку на AsyncTask в вашу функцию loadFeed.Примерно так:

    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        loadFeed(this);
        return null;
    }

private void loadFeed(AsyncTask<Void, Void, Void> asyncTask){
        // make calls to publishProgress in here.
           try{ 
            BaseFeedParser parser = new BaseFeedParser();
            messages = parser.parse();

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


            finish();
        }
    }

Вам также потребуется реализовать метод onProgressUpdate(), которого у вас нет.Здесь вы на самом деле обновите значение индикатора выполнения.

     protected void onProgressUpdate(Integer... progress) {
         dialog.setProgress(progress[0]);
     }
0 голосов
/ 28 ноября 2011

Внутри парсера loadFeed вы можете использовать ссылку AsyncTask с методом publishProgress для отправки обновлений прогресса на onProgressUpdate, где вы можете обновить индикатор выполнения.

0 голосов
/ 28 ноября 2011

Да.Это правильный рабочий процесс, показывающий диалоговое окно прогресса перед выполнением в потоке пользовательского интерфейса (это можно было бы сделать и вне этого класса, но этот способ выглядит лучше), выполняя свою работу с методом doInBackground, обновляя ваш ProgressDialog с помощью publishProgress () при необходимостизатем отклоните ваш ProgressDialog и покажите результаты onPostExecute () в вашем потоке пользовательского интерфейса.

...