Mam AsyncTask obsłużyć stosunkowo długo uruchomiony proces aktualizacji, a ja chcę się okno postępu, który pokazuje, w kolejności:Jak przełączać okno dialogowe postępu między ustalonym i nieokreślonym?
- „Uruchamianie update” (na krótkie sekundy)
- „Pobieranie aktualizacji” (bez paska postępu — nie wiem jak duża aktualizacja będzie zanim go pobrać)
- „Zapisywanie danych update” (z paskiem postępu 0-100%)
- „Zapisywanie obrazów aktualizacji” (z 0-100% paska postępu)
- "Aktualizacja zakończona" (za br ief sekund przed zniknięciem okna dialogowego)
Mam problemy z przełączaniem się pomiędzy dialogami pomiędzy określonymi (pasek postępu pokazuje się) i nieokreślonymi (bez paska postępu).
Kod w moim AsyncTask następująco:
private final ProgressDialog progressDialog;
public SynchronizeTask(Activity activity)
{
progressDialog = new ProgressDialog(activity);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
}
protected void onPreExecute() {
progressDialog.setMessage("Starting update...");
progressDialog.setCancelable(false);
progressDialog.show();
}
...lots of code here...
// all of these are set from doInBackground()
private String progressMsg;
private int progressTotal;
private int progressProgress;
protected void onProgressUpdate(Void... values) {
progressDialog.setMessage(progressMsg);
if (progressTotal > 0) {
progressDialog.setIndeterminate(false);
progressDialog.setMax(progressTotal);
progressDialog.setProgress(progressProgress);
} else {
progressDialog.setIndeterminate(true);
progressDialog.setMax(0);
progressDialog.setProgress(0);
}
}
Próbowałem przełączanie zdeterminowanej z setIndeterminate()
— Problemem jest to, że pokazuje dialogowe postępu „NaN” i „0%” w dolnej części okna, mimo nie ma "paska" pozostawionego w nieokreślonym trybie.
Potem próbowałem używać setProgressNumberFormat()
i setProgressPercentFormat()
tylko do ukrycia numerów —, ale żadne z nich nie są obsługiwane w systemie Android poniżej wersji 3.0.
Potem próbowałem za pomocą setProgressStyle()
aby przełączać między STYLE_SPINNER i STYLE_HORIZONTAL — wywołującego setProgressStyle()
w moim onProgressUpdate()
wydaje się powodować moja aplikacja do katastrofy.
Czy istnieje łatwy sposób przełączania okna dialogowego postępu między trybem ustalonym a nieokreślonym?
OK, który wydaje się działać - ja założyć, że nie będzie w stanie odtworzyć ProgressDialog „w locie”, ale wydaje się, działa dobrze, biorąc pod uwagę, że onProgressUpdate() działa w wątku interfejsu użytkownika. Ustawiam flagę binarną "newDialog" dla każdej nowej "fazy" aktualizacji i jeśli widzę, że flaga jest ustawiona w moim onProgressUpdate() I: odrzuć stare okno dialogowe; utwórz nowy dialog z wybranym przeze mnie stylem (spinner lub horizontal); pokaż nowe okno dialogowe; ustaw newDialog z powrotem na false. Dzięki za wskazówkę. – George