当打开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。
我怎么能这样做?
答案 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;
}