2015-11-03 12 views
6

Ich habe diese Klasse, die von einem Fragment aufgerufen wird. Beim Fortschritt wird das Update aufgerufen, aber die Nachricht wird nicht aktualisiert. Ich sehe auch keinen Fortschrittsbalken oder Spinner. Nur der Titel und die Nachricht, einige ähnliche Probleme, aber nichts, wo der Fortschrittsbalken überhaupt nicht angezeigt wird. Außerdem wird meine Nachricht in onProgressUpdate überhaupt nicht aktualisiert, aber das Ausdrucken der Werte zeigt, dass es sich innerhalb von onProgressUpdate erhöht.Fortschrittsdialog zeigt, aber keine Fortschrittsbalkenanzeige und Nachricht wird nicht aktualisiert

Edit: Hier ist, wie ich die Aufgabe

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

Hier beginnen die Klasse

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

Wie haben Sie die Aufgabe gestartet, zeigen Sie bitte den Code an. – starkshang

+0

Editiert es, um die Art zu zeigen, wie ich es starte, es ist nur die generische Art, wie Sie eine Aufgabe starten, deshalb habe ich es nicht aufgenommen. Hilft das überhaupt? – Zach

Antwort

3

Das Problem ist mit der Art, wie Ihr ProgressDialog initialisiert wird.

Ersetzen Sie Ihre OnPreExecute mit diesem:

@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(); 
} 

Im Wesentlichen müssen Sie setProgressStyle vor dem Aufruf von Show nennen.

Darüber hinaus können Sie den runOnUiThread-Code in onProgressUpdate entfernen, da onProgressUpdate im UI-Thread aufgerufen wird.

+0

Wow, so ein einfaches Problem. Vielen Dank, werde Kopfgeld geben, wenn ich ~ 22 Stunden übrig habe – Zach

+1

Gut zu helfen - es ist ein kniffliger Fehler. Wenn Sie interessiert sind, werfen Sie einen Blick auf die ProgressDialog-Quelle - Sie werden sehen, warum Sie auf dieses Problem gestoßen sind. https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ProgressDialog.java#L324 – Aaron

0

Nicht sicher über die genaue Ursache, aber es ist nicht erforderlich, zu setProgress auf runnable als onProgressUpdate wird auf UI-Thread ausgeführt.

Try Ersetzen

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

mit

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

Auch - Tun Sie Sachen in doInbackground() Networking, sonst können wir keine Fortschritte sehen, die auf onPostExecute() entlassen wird.

+0

Ich hatte das schon vorher, aber es funktionierte nicht, also entschied ich mich, den runonuithread zu versuchen. Ich lade Bilder herunter, ja, es dauert eine Weile. Der Dialog zeigt, aber es ist kein Fortschrittsbalken drin, nur der Titel. Sobald es fertig ist, die Bilder herunterzuladen, schließt es gut – Zach

+0

Ok. Versuchen Sie vielleicht zuerst, den Fortschrittsdialog zu initialisieren, und rufen Sie 'show()' später am Ende von 'onPreExecute()' – sha