2

私が欲しいもの: ViewFlipper にビューを動的に追加しているときに進行状況ダイアログを表示したい。

私が持っているもの:これを達成するために AsyncTask を使用しました。ViewFlipper はメイン アクティビティで宣言されています。AsyncTask の doInBackground() で ViewFlipper にビューを追加しています。

問題は何ですか: viewFlipper.addView() ステートメントで例外が発生していますが、その例外は「メインがウィンドウ 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();
      }
  }
}
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 に答える