如何使用AsyncTask显示ProgressBar并加载Rss

时间:2011-11-28 15:14:50

标签: android rss progress-bar android-asynctask

我正在使用AsyncTask在加载Rss News时显示progressBar。因为这是我第一次使用asyncTask我不知道我的方法是否正确,所以你能不能告诉我它是否对你好看?它的工作但我只是想吃!谢谢

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 个答案:

答案 0 :(得分:2)

要更新进度条,您需要拨打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]);
     }

答案 1 :(得分:0)

是。 这是正确的工作流程,在UI线程上执行之前显示进度对话框(也可以在此类之外完成,但这种方式似乎更好),在doInBackground方法上工作,如果需要,使用publishProgress()更新ProgressDialog ,然后解除你的ProgressDialog并在你的UI线程中显示onPostExecute()的结果。

答案 2 :(得分:0)

在loadFeed解析器中,您可以使用方法publishProgress的AsyncTask引用将进度更新发送到onProgressUpdate,您可以在其中更新进度条。