我的主活动在用户单击按钮时调用AsyncTask。这个AsyncTask执行一个相当长的操作,包括一个进度对话框。其中一些操作涉及将TableRow视图添加到我的主活动中的现有表中。
但是,我的问题是,操作完成后,这些行不会显示在活动GUI中。我知道它们是正确创建的,因为如果我按下手机上的“菜单”退出我的应用程序,然后再次打开应用程序,TableRow视图会相应地填充到各自的位置。所有看起来像是perfect...the UI线程的东西都没有被重新加载。
因此,我显然遗漏了在AsyncTask完成其职责后调用的某种函数。有人知道这个刷新函数可能是什么吗?
谢谢。
代码如下:
public void buttonClick(View view) {
if (view.getId() == R.id.button_begin) {
cr = this.getContentResolver();
dialog = new ProgressDialog(this);
dialog.setCancelable(false);
dialog.setMessage("Checking...");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// reset the bar to the default value of 0
dialog.setProgress(0);
// display the progress bar
dialog.show();
new mainAsyncTask().execute();
}
}
@Override
protected void onPreExecute() {
try {
//create row span so description can overlap columns in the rows
span = new TableRow.LayoutParams();
span.span = 3;
// set the maximum value
dialog.setMax(numberOfItems.length);
//initialize facebook
fb = new FacebookInfo(context, mainActivity, settings, numberOfItems.length, isPaid, settings.getBoolean("checkBoxShareShort", false));
description = new String[numberOfItems.length];
factor = new String[numberOfItems.length];
cool = new String[numberOfItems.length];
cannot = new String[numberOfItems.length];
name = new String[numberOfItems.length];
ivFacebookPub = new ImageView[numberOfItems.length];
ivShare = new ImageView[numberOfItems.length];
tableGrid = new TableLayout[numberOfItems.length];
super.onPreExecute();
}
catch (Exception ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
table.addView(rowError);
rowError.addView(tvError, 0, span);
}
}
@Override
protected Void doInBackground(Void... params) {
for (int i = 0; i < numberOfItems.length; i++){
try {
if (Numbers[i] != null) {
if (flag == true) {
flag = false;
}
else if (flag == false) {
flag = true;
}
fb.addDescription(i, justStuff2[1]);
fb.addCannot(i, justStuff2[0]);
description[i] = justStuff2[1];
cannot[i] = justStuff2[0];
//initialize table
tableGrid[i] = TableVisuals.createTable(context, flag, i, clickViewContact);
//initialize rows
TableRow rowNamePhoto2 = new TableRow(context);
TableRow rowCannot2 = new TableRow(context);
TableRow rowStuff = new TableRow(context);
TableRow rowStuff2 = new TableRow(context);
TableRow rowInfo2 = new TableRow(context);
TableRow rowShare2 = new TableRow(context);
//create rows
rowNamePhoto2 = TableVisuals.createRow(context, flag);
rowCannot2 = TableVisuals.createRow(context, flag);
rowStuff = TableVisuals.createRow(context, flag);
//initialize views
TextView tvName2 = new TextView(context);
ImageView ivPhoto2 = new ImageView(context);
ImageView ivArrow2 = new ImageView(context);
TextView tvCannot2 = new TextView(context);
TextView tvDescription = new TextView(context);
//add data to views
tvName2 = TableVisuals.getName(context, cr, Numbers[i]);
ivPhoto2 = TableVisuals.getPhoto(context, cr, Numbers[i]);
ivArrow2 = TableVisuals.getArrowIcon(context, cr, Numbers[i]);
tvCannot2 = TableVisuals.getCannot(context, justStuff2[0]);
tvDescription = TableVisuals.getStuff(context, justStuff2[1]);
//add views to row
rowNamePhoto2.addView(ivPhoto2, 0);
rowNamePhoto2.addView(tvName2, 1);
rowNamePhoto2.addView(ivArrow2, 2);
rowCannot2.addView(tvCannot2, 0, span);
rowStuff.addView(tvDescription, 0, span);
//populate data
fb.addName(i, (String)tvName2.getText());
name[i] = (String)tvName2.getText();
if (isPaid == true) {
//create rows
rowStuff2 = TableVisuals.createRow(context, flag);
rowInfo2 = TableVisuals.createRow(context, flag);
//initialize views
TextView tvRatio2 = new TextView(context);
TextView tvVariance2 = new TextView(context);
//add data to views
tvRatio2 = TableVisuals.getRatio(context, justStuff2[3]);
tvVariance2 = TableVisuals.getVariance(context, justStuff2[2]);
//add views to row
rowStuff2.addView(tvRatio2, 0, span);
rowInfo2.addView(tvVariance2, 0, span);
//populate data
fb.addCool(i, (String)tvRatio2.getText());
fb.addFactor(i, (String)tvVariance2.getText());
cool[i] = (String)tvRatio2.getText();
factor[i] = (String)tvVariance2.getText();
}
if (settings.getBoolean("checkBoxSharing", true) == true) {
rowShare2 = TableVisuals.createRow(context, flag);
ivFacebookPub[i] = TableVisuals.createFacebookPublish(context, i, fb.clickFacebookPublish);
//add facebookPublish button
rowShare2.addView(ivFacebookPub[i], 0);
//add share button
ivShare[i] = TableVisuals.createShare(context, i, fb.clickShareResults);
rowShare2.addView(ivShare[i], 1);
}
//add rows to table
tableGrid[i].addView(rowNamePhoto2);
tableGrid[i].addView(rowCannot2);
if (isPaid) {
tableGrid[i].addView(rowStuff2);
tableGrid[i].addView(rowInfo2);
}
tableGrid[i].addView(rowStuff);
if (settings.getBoolean("checkBoxSharing", true) == true) {
tableGrid[i].addView(rowShare2);
}
//add table to the main table
table.addView(tableGrid[i]);
//initialize line
TableRow rowLine2 = new TableRow(context);
rowLine2 = TableVisuals.createLineRow(context);
TextView tvLine2 = new TextView(context);
tvLine2 = TableVisuals.createRowLine(context);
//add line view
rowLine2.addView(tvLine2, 0, span);
table.addView(rowLine2);
}
publishProgress(i,0);
}
catch (Exception ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
publishProgress(i, 1);
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... value) {
dialog.setProgress(value[0]);
}
@Override
protected void onPostExecute(Void unused) {
//close progress bar dialog
dialog.dismiss();
//here is where I try the invalidate and postInvalidate
table.invalidate();
for (int i = 0; i < numberOfItems.length; i++) {
tableGrid[i].invalidate();
}发布于 2011-07-23 11:14:41
听起来你的屏幕没有被刷新/重绘。这可能在Adapter中吗?如果是,则在适配器上调用notifyDataSetChanged()。如果没有,请尝试通过调用invalidate()来使您的TableLayout无效
编辑在你的实现中有一个巨大的根本性缺陷。您正在非UI线程上创建UI元素。我有点惊讶你的应用程序没有崩溃,但我想如果你在后台线程中创建它们,它就不会因为你在后台线程上操纵它们而对你大惊小怪,但当涉及到我时,你就没那么幸运了:)。所有与UI相关的东西都需要在UI线程上,无论它是通过onProgressUpdate()还是在onPostExecute()中。我可以保证你的问题源于此。
https://stackoverflow.com/questions/6797985
复制相似问题