2012-11-08 12 views
9

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?

  1. „Uruchamianie update” (na krótkie sekundy)
  2. „Pobieranie aktualizacji” (bez paska postępu — nie wiem jak duża aktualizacja będzie zanim go pobrać)
  3. „Zapisywanie danych update” (z paskiem postępu 0-100%)
  4. „Zapisywanie obrazów aktualizacji” (z 0-100% paska postępu)
  5. "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?

Odpowiedz

3

Może być dobrym pomysłem zamknięcie jednego okna dialogowego postępu i otwarcie innego z innym stylem.

+1

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

-1

Można zmienić swój kod do tego:

protected void onProgressUpdate(Void... values) { 
    progressDialog.setMessage(progressMsg); 
    if (progressTotal > 0) { 
     progressDialog.setIndeterminate(false); 
     progressDialog.setProgressNumberFormat("%1d/%2d"); 
     progressDialog.setProgressPercentFormat(NumberFormat.getPercentInstance()); 
     progressDialog.setMax(progressTotal); 
     progressDialog.setProgress(progressProgress); 
    } else { 
     progressDialog.setIndeterminate(true); 
     progressDialog.setProgressNumberFormat(null); 
     progressDialog.setProgressPercentFormat(null); 
    } 
} 
Powiązane problemy