ViewFlipper.addView () дает исключение при отображении диалогового окна хода выполнения в AsyncTask - PullRequest
2 голосов
/ 21 июля 2011

Что я хочу: Я хочу показать диалоговое окно прогресса при динамическом добавлении представлений в мой ViewFlipper.

Что у меня есть: Я использовал AsyncTask длядостичь этого.ViewFlipper объявлен в моей основной деятельности, я добавляю представления к ViewFlipper в doInBackground () AsyncTask.

В чем проблема: Я получаю исключение для viewFlipper.addView() и исключение: «Main утекло окно 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 Ответ

3 голосов
/ 21 июля 2011

Вы пытаетесь взаимодействовать с пользовательским интерфейсом из фонового потока, что запрещено.Вам разрешено связываться с пользовательским интерфейсом в ваших методах onPostExecute () и onPreExecute () .Есть другой метод; onProgressUpdate () , который вы можете использовать следующим образом:

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

Очевидно, вам нужно будет обработать передачу представления этому методу путем создания поля или чего-то еще.Вы можете вызвать это в вашем doInBackground () следующим образом:

publishProgress(0);

Функция обычно используется для обновления процентного значения в строке загрузки или аналогичной (отсюда и передача целого числа), но она должна хорошо работать в ваших целях.

...