【发布时间】:2014-05-31 05:18:18
【问题描述】:
我正在使用 AsyncTask 动态填充 TableLayout 行,但没有得到预期的 ProgressBar 行为。
我最初将ProgressBar 的最大值设置为我正在处理的项目数的三倍以适应三个操作。这是我的代码:
onPreExecute:
progress.setMax(items.size() * 3); // We need to create the rows and add listeners to them
异步类
public class TableLoader extends AsyncTask<Object, String, Boolean>{
@Override
protected Boolean doInBackground(Object... params) {
for (int i = 0; i < items.size(); i++) {
// doStuffToCreateRow
rows.add(row);
progress.publishProgress();
}
}
那么我有:
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (!isCancelled()) {
for (int i = 0; i < rows.size(); i++) {
table.addView(rows.get(i));
progress.incrementProgressBy(1);
}
table.requestLayout();
listener.onTaskCompleted();
}
}
publishProgress 很简单:
protected void onProgressUpdate(String... values) {
progress.incrementProgressBy(1);
}
最后,在我的onPostExecute method 中,我对使用AsyncTask 的活动进行了回调,在主活动中如下所示:
public void onTaskCompleted() { // TableRows have been generated
TableLayout itemTable = (TableLayout) findViewById(R.id.itemTable);
for (int i = 0; i < itemTable.getChildCount(); i++) {
TableRow row = (TableRow) itemTable.getChildAt(i);
// Create and add a listener to that row's checkbox
// progress.incrementProgressBy(1);
}
progress.setVisibility(View.GONE);
}
由于某种原因,初始增量正常工作并导致progressBar 在完成(生成 TableRows)后达到 1/3。之后,有 2-5 秒的暂停,UI 线程阻塞,然后 progressBar 消失,我已将其设置为在 onTaskCompleted(第三个也是最后一个操作)中的 for 循环终止后发生。然后显示数据。
为什么我的progressBar 没有按预期更新?
我查看了问题,但发现人们使用除法或不使用 UI 线程将条形增加
【问题讨论】:
标签: android multithreading android-asynctask tablelayout android-progressbar