2015-11-03 21 views
6

Mam tę klasę, która zostanie wywołana z fragmentu. Aktualizacje postępu są wywoływane, ale komunikat nie zostanie zaktualizowany. Nie widzę też żadnego paska postępu ani spinnera. Tylko tytuł i wiadomość, widziałem kilka podobnych problemów, ale nic, gdzie pasek postępu w ogóle nie jest wyświetlany. Ponadto, moja wiadomość nie będzie w ogóle aktualizowana w onProgressUpdate, ale wydrukowanie wartości pokazuje, że wzrasta wewnątrz onProgressUpdate.Okno dialogowe postępu, ale brak paska postępu i komunikat nie jest aktualizowany.

Edycja: Oto jak ja uruchomić zadanie

DownloadFilesTask download = new DownloadFilesTask(); 
download.execute(urls.toArray(new String[urls.size()])); 

Tutaj jest klasa

private class DownloadFilesTask extends AsyncTask<String, Integer, Long> { 

ProgressDialog progressDialog; 

@Override 
protected void onPreExecute() 
{ 
    progressDialog = ProgressDialog.show(getActivity(), "Downloading","Downloaded 0/"+urls.size(), false); 
    progressDialog.setProgress(0); 
    progressDialog.setMax(urls.size()); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
} 

@Override 
protected Long doInBackground(String[] urls) { 
    int count = urls.length; 
    long totalSize = 0; 
    for (int i = 0; i < count; i++) { 
      //Do things in background here 
      publishProgress(new Integer[] {i}); 
    } 
    return totalSize; 
} 

@Override 
protected void onProgressUpdate(final Integer... progress) { 
    System.out.println(progress[0]); //This does print correctly 
    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      progressDialog.setProgress(progress[0]); 
      progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size()); 
     } 
    }); 
} 

@Override 
protected void onPostExecute(Long result) { 
    progressDialog.dismiss(); 
    Toast t = Toast.makeText(getActivity(), "Downloaded", Toast.LENGTH_LONG); 
    t.show(); 
} 

}

+1

Jak rozpocząć zadanie, proszę pokazać kod. – starkshang

+0

Edytował tak, aby pokazać sposób, w jaki go uruchamiam, jest to tylko ogólny sposób rozpoczęcia zadania, dlatego nie uwzględniłem go. Czy to w ogóle pomaga? – Zach

Odpowiedz

3

Problem dotyczy sposobu inicjowania pliku ProgressDialog.

Wymień onPreExecute z tym:

@Override 
protected void onPreExecute() { 
    progressDialog = new ProgressDialog(activity); 
    progressDialog.setTitle("Downloading"); 
    progressDialog.setMessage("Downloaded 0/" + urls.size()); 
    progressDialog.setIndeterminate(false); 
    progressDialog.setProgress(0); 
    progressDialog.setMax(urls.size()); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    progressDialog.show(); 
} 

Zasadniczo trzeba zadzwonić setProgressStyle przed wywołaniem show.

Dodatkowo można usunąć kod runOnUiThread w onProgressUpdate ponieważ onProgressUpdate jest wywoływana na wątków UI.

+0

Wow, taki prosty problem. Bardzo dziękuję, nagrodzę nagrodę, gdy mogę ~ 22 godzin na wyjeździe – Zach

+1

Cieszę się, że pomogę - to podstępny błąd. Jeśli jesteś zainteresowany, spójrz na źródło ProgressDialog - zobaczysz, dlaczego pojawił się ten problem. https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ProgressDialog.java#L324 – Aaron

0

Nie jestem pewien dokładnej przyczyny, ale nie jest to konieczne do setProgress na runnable jako onProgressUpdate będzie działać na wątku UI.

spróbować wymienić

getActivity().runOnUiThread(new Runnable() { @Override public void run() { progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size()); } });

z

progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size());

Również - robisz rzeczy w sieci doInbackground(), jeszcze nie widzimy postęp, który zostanie odwołany onPostExecute().

+0

Tak naprawdę miałem to wcześniej, ale nie działało, więc zdecydowałem się spróbować runituithread. Pobieram obrazy, więc tak to zajmuje trochę czasu. Okno dialogowe pokazuje, ale nie ma paska postępu, tylko tytuł. Po zakończeniu pobierania obrazów zamyka się dobrze – Zach

+0

Ok. Może spróbuj najpierw zainicjować okno dialogowe postępu i wywołać 'show()' później na końcu 'onPreExecute()' – sha