2

我想要什么:我想在动态添加视图到我的 ViewFlipper 时显示一个进度对话框。

我所拥有的:我使用了 AsyncTask 来实现这一点。ViewFlipper 在我的 Main Activity 中声明,我在 AsyncTask 的 doInBackground() 中向 ViewFlipper 添加视图。

问题是什么: 我在 viewFlipper.addView() 语句中遇到异常,异常是“Main has leaked window com.android.internal.policy.impl ..... that was original added here.”,一些像这样。

这是代码:

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();
      }
  }
}
4

1 回答 1

3

您正在尝试从不允许的后台线程与 UI 交互。您可以在onPostExecute()onPreExecute()方法中弄乱 UI。还有另一种方法;onProgressUpdate()你可以像这样使用:

protected void onProgressUpdate(Integer... progress) {
// on UI thread!
    viewFlipper.addView(rl_main);
}

显然,您需要通过创建字段或其他东西来处理将视图传递给此方法。您可以在 doInBackground() 中使用以下命令调用它:

publishProgress(0);

该函数通常用于更新加载栏或类似内容上的百分比(因此传递整数),但应该可以很好地满足您的目的。

于 2011-07-21T14:43:48.787 回答