我想要的是什么:我想在向ViewFlipper动态添加视图时显示进度对话框。
我有什么:我使用了AsyncTask来实现这一目标。 ViewFlipper在我的主Activity中声明,我在AsyncTask的doInBackground()中向ViewFlipper添加视图。
有什么问题:我在viewFlipper.addView()语句中遇到异常,异常是“Main has leaked window com.android.internal.policy.impl ....这最初是在这里添加的。“,就像这样。
以下是代码:
public class Main extends Activity
{
private ViewFlipper viewFlipper;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_flipper);
viewFlipper = (ViewFlipper)findViewById(R.id.id_vf_main);
new LoadData().execute();
// Some other tasks.
}
class LoadData extends AsyncTask<Object, Void, String>
{
protected ProgressDialog progressDialog;
@Override
protected void onPreExecute()
{
super.onPreExecute();
progressDialog = ProgressDialog.show(Main.this,"Loading", "Loading Data...", true, false);
}
@Override
protected String doInBackground(Object... parametros)
{
for (int i = 0; i < Login.data_Channel_Name.size(); i++)
{
LayoutInflater inflater = getLayoutInflater();
RelativeLayout rl_main = (RelativeLayout) inflater.inflate(R.layout.main,null);
TextView tv_channelNumber = (TextView)rl_main.findViewById(R.id.id_tv_ChannelNumber);
if(tv_channelNumber != null)
{
tv_channelNumber.setText("Some Number");
}
TextView tv_channelName = (TextView)rl_main.findViewById(R.id.id_tv_ChannelName);
if(tv_channelName != null)
{
tv_channelName.setText("Some name");
}
viewFlipper.addView(rl_main);
}
return null;
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
progressDialog.dismiss();
}
}
}
答案 0 :(得分:3)
您正尝试从后台线程与UI进行交互,这是不允许的。您可以在 onPostExecute()和 onPreExecute()方法中弄乱用户界面。还有另一种方法; onProgressUpdate()你可以像这样使用:
protected void onProgressUpdate(Integer... progress) {
// on UI thread!
viewFlipper.addView(rl_main);
}
显然,您需要通过创建字段或其他东西来处理将视图传递给此方法。您可以使用以下命令在doInBackground()中调用它:
publishProgress(0);
该函数通常用于更新加载栏或类似的百分比(因此传递整数),但应该可以正常工作。