Я новичок в 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();
}
}