使用AsyncTask选择和取消选中复选框时,Android ProgressDialog

时间:2011-02-13 12:39:40

标签: android android-asynctask progressdialog

我是Android的新手,我遇到了AsyncTask类的一些问题。我有很多(超过100个)复选框,我想要选中或取消选中“全选”复选框。 不幸的是,这需要相当长的时间,对用户来说很明显,所以我想使用ProgressDialog来显示选择正在进行中。

现在我知道UI元素的更新应该在UI线程中完成,所以我在onProgressUpdate方法中选择了代码,但ProgressDialog在处理之前不会显示(选择或取消选中所有复选框)完了...

这应该如何完成?有任何解决方法或任何其他解决方案吗?我也尝试通过doInBackground()方法中的所有复选框,但是我得到了很多奇怪的错误(我猜这是因为UI)。

这是我的代码:

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 :(得分:0)

如果在执行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(); 
          }   
}