【发布时间】:2010-04-24 00:21:40
【问题描述】:
我有一个 Android 活动,它从 URL 中获取 RSS 提要,并使用 SAX 解析器将 XML 中的每个项目粘贴到一个数组中。这一切都很好,但正如预期的那样,需要一些时间,所以我想使用 AsyncActivity 在后台执行此操作。我的代码如下:
class AddTask extends AsyncTask<Void, Item, Void> {
protected void onPreExecute() {
pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true);
}
protected Void doInBackground(Void... unused) {
items = parser.getItems();
for (Item it : items) {
publishProgress(it);
}
return(null);
}
protected void onProgressUpdate(Item... item) {
adapter.add(item[0]);
}
protected void onPostExecute(Void unused) {
pDialog.dismiss();
}
}
我打电话给onCreate()
new AddTask().execute();
items = parser.getItems() 行工作正常 - items 是包含 XML 中每个项目的数组列表。我面临的问题是,在启动活动时,我在onPreExecute() 中创建的 ProgressDialog 直到doInBackground() 方法完成后才会显示。即我得到一个黑屏,长时间的停顿,然后是一个包含项目的完全填充列表。为什么会发生这种情况?为什么不绘制 UI、显示 ProgressDialog、解析器获取项目并逐步将它们添加到列表中,然后 ProgressDialog 关闭?
【问题讨论】:
-
在“解析器获取项目并逐步将它们添加到列表”部分中,缓慢的步骤将出现在解析中,此时您不会向列表中添加任何内容。因此,您的所有项目都会很快进入列表,所以不要指望这里有太多的“增量”效果。
-
没问题,我并不介意插入的“增量”程度,我只希望 ProgressDialog 在后台工作完成时显示出来,并在完成后消失。