ViewFlipper.addView()提供Exception,同时在AsyncTask中显示进度对话框

时间:2011-07-21 14:05:51

标签: android android-ui android-asynctask

我想要的是什么:我想在向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();
      }
  }
}

1 个答案:

答案 0 :(得分:3)

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

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

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

publishProgress(0);

该函数通常用于更新加载栏或类似的百分比(因此传递整数),但应该可以正常工作。