AsyncTask.onProgressUpdate()完成后如何更新UI?

时间:2017-03-29 18:30:31

标签: android

当打开Activity我开始长(10 sek)过程。此过程创建10个项目的列表。并在10秒后完成。结果列表显示(UI更新)10秒后。

但是我需要在创建之后立即显示每个项目。因此,第一项必须在1秒后显示。

所以我为此创建了AsyncTask:

onCreate() {
 BackgroundTask  backgroundTask  = new BackgroundTask ();
   backgroundTask.execute(newsDetailsList);
}

    private class BackgroundTask  extends AsyncTask<List<NewsDetails>, NewsDetails, Void> {


        @Override
        protected Void doInBackground(List<NewsDetails>... newsDetailsList) {
            List<NewsDetails> passedList = newsDetailsList[0];
            for (NewsDetails newsDetails : passedList) {
                publishProgress(newsDetails);
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(final NewsDetails... passedNewsDetails) {
           super.onProgressUpdate(passedNewsDetails);
           final NewsDetails newsDetails = passedNewsDetails[0];
          // here create UI for new items newsDetails
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
        }
}

但是,在 onPostExecute()完成后(在10秒后),UI会更新。但我需要在每次完成(10次)方法 onProgressUpdate()后更新UI。

我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

只需调用notifyDataSetChanged

即可
      @Override
        protected void onProgressUpdate(final NewsDetails... passedNewsDetails) {
           super.onProgressUpdate(passedNewsDetails);
                adapter.notifyDataSetChanged();
        }

基本上,每次进度更新时刷新ListView

答案 1 :(得分:0)

创建一个新类:

public interface NewsDetailsInterface{
void receiveData(Object object);
}

然后更改您的ASyncTask以抽象并实现接口:

private abstract class BackgroundTask  extends AsyncTask<List<NewsDetails>,
NewsDetails, Void> implements NewsDetailsInterface{

public abstract receiveData(Object object);

//.. the rest of your task below ..

然后,无论您在何处实例化ASyncTask,都需要重新创建它,如下所示:

BackgroundTask  backgroundTask  = new BackgroundTask (){
            @Override
            public void receiveData(Object object) {
                 //do something with the object, like create a new list item
            }
       };

现在,您可以使用doInBackground每隔1秒调用一次receiveData,每次调用它时,您的界面都会立即对该数据执行某些操作:

@Override
    protected Void doInBackground(List<NewsDetails>... newsDetailsList) {
        List<NewsDetails> passedList = newsDetailsList[0];
        for (NewsDetails newsDetails : passedList) {
            receiveData(newsDetails);
        }
        return null;
    }