Android ProgressDialog при установке и снятии флажков с помощью AsyncTask - PullRequest
0 голосов
/ 13 февраля 2011

Я новичок в Android и у меня возникли некоторые проблемы с классом AsyncTask. У меня много (более 100) флажков, которые я хочу установить или отменить выбор с помощью флажка «выбрать все». К сожалению, это занимает довольно много времени, заметного для пользователя, поэтому я хочу использовать ProgressDialog, чтобы показать, что выбор выполняется.

Теперь я знаю, что обновления элементов пользовательского интерфейса должны выполняться в потоке пользовательского интерфейса, поэтому у меня есть код выбора в методе onProgressUpdate, но ProgressDialog не отображается до обработки (установите или снимите все флажки) закончено ...

Как это должно быть сделано? Есть ли обходной путь или любое другое решение? Я также пытался пройти через все флажки в методе doInBackground (), но я получаю много странных ошибок (наверное, из-за пользовательского интерфейса).

Это мой код:

customPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

      @Override
      public boolean onPreferenceChange(final Preference preference, final Object object) {
          new CbSelection().execute(preference);
          return true;
      }
});


private class CbSelection extends AsyncTask<Preference, Boolean, Void> {   

          private ProgressDialog Dialog = new ProgressDialog(Preferences.this);

          @Override
          protected void onPreExecute() {   
              Dialog.setMessage("Please wait..."); 
              Dialog.setCanceledOnTouchOutside(true);
              Dialog.setCancelable(true);
              Dialog.show();   
          }   

          @Override
          protected Void doInBackground(Preference... pref) {   

              PreferenceScreen screen = (PreferenceScreen)getPreferenceScreen().getRootAdapter().getItem(2);

              Preference preference = pref[0];
              if(preference.getKey().compareTo("select_all") == 0){
                  publishProgress(true);
              } 
              return null; 
          }   

          @Override
          protected void onProgressUpdate(Boolean... ok) {
              if(ok[0]== true) {
                  PreferenceScreen screen = (PreferenceScreen)getPreferenceScreen().getRootAdapter().getItem(2);
                  for(int i = 0; i < screen.getPreferenceCount(); ++i) {
                      //Dialog.show();
                       /* select or deselect all checkboxes here... */
                  }

              }
          }

          @Override
          protected void onPostExecute(Void v) {   
              Dialog.cancel(); 
          }   
} 

1 Ответ

0 голосов
/ 13 февраля 2011

Что если вы создадите и отобразите диалоговое окно перед выполнением AsyncTask?Вот как это обычно используется:

private ProgressDialog Dialog;
customPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

      @Override
      public boolean onPreferenceChange(final Preference preference, final Object object) {
          Dialog = new ProgressDialog(Preferences.this);
          Dialog.setMessage("Please wait..."); 
          Dialog.setCanceledOnTouchOutside(true);
          Dialog.setCancelable(true);
          Dialog.show();   

          new CbSelection().execute(preference);
          return true;
      }
});
private class CbSelection extends AsyncTask<Preference, Boolean, Void> {   

          @Override
          protected Void doInBackground(Preference... pref) {   
              PreferenceScreen screen = (PreferenceScreen)getPreferenceScreen().getRootAdapter().getItem(2);

              Preference preference = pref[0];
              if(preference.getKey().compareTo("select_all") == 0){
                  publishProgress(true);
              } 
              return null; 
          }   

          @Override
          protected void onProgressUpdate(Boolean... ok) {
              if(ok[0]== true) {
                  PreferenceScreen screen = (PreferenceScreen)getPreferenceScreen().getRootAdapter().getItem(2);
                  for(int i = 0; i < screen.getPreferenceCount(); ++i) {
                      /* select or deselect all checkboxes here... */
                  }

              }
          }

          @Override
          protected void onPostExecute(Void v) {   
              Dialog.dismiss(); 
          }   
} 
...