Ich versuche, den gleichen Fortschritt zu reproduzieren, den DownloadManager in der Benachrichtigungsleiste meiner App anzeigt, aber mein Fortschritt wird nie veröffentlicht. Ich versuche es mit runOnUiThread () zu aktualisieren, aber aus irgendeinem Grund wurde es nicht aktualisiert.
Mein Download:
String urlDownload = "https://dl.dropbox.com/s/ex4clsfmiu142dy/test.zip?token_hash=AAGD-XcBL8C3flflkmxjbzdr7_2W_i6CZ_3rM5zQpUCYaw&dl=1";
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(urlDownload));
request.setDescription("Testando");
request.setTitle("Download");
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "teste.zip");
final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
final long downloadId = manager.enqueue(request);
final ProgressBar mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
new Thread(new Runnable() {
@Override
public void run() {
boolean downloading = true;
while (downloading) {
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(downloadId);
Cursor cursor = manager.query(q);
cursor.moveToFirst();
int bytes_downloaded = cursor.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
downloading = false;
}
final double dl_progress = (bytes_downloaded / bytes_total) * 100;
runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress((int) dl_progress);
}
});
Log.d(Constants.MAIN_VIEW_ACTIVITY, statusMessage(cursor));
cursor.close();
}
}
}).start();
meine statusMessage-Methode:
private String statusMessage(Cursor c) {
String msg = "???";
switch (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))) {
case DownloadManager.STATUS_FAILED:
msg = "Download failed!";
break;
case DownloadManager.STATUS_PAUSED:
msg = "Download paused!";
break;
case DownloadManager.STATUS_PENDING:
msg = "Download pending!";
break;
case DownloadManager.STATUS_RUNNING:
msg = "Download in progress!";
break;
case DownloadManager.STATUS_SUCCESSFUL:
msg = "Download complete!";
break;
default:
msg = "Download is nowhere in sight";
break;
}
return (msg);
}
Mein Protokoll funktioniert einwandfrei, während mein Download ausgeführt wird und "Download in Bearbeitung!" und wenn es abgeschlossen ist "Download abgeschlossen!", aber das gleiche passiert nicht bei meinem Fortschritt, warum? Ich brauche wirklich Hilfe, andere Logiken dafür werden sehr geschätzt
android
progress-bar
Victor Laerte
quelle
quelle
Antworten:
Sie teilen zwei ganze Zahlen:
Da
bytes_downloaded
ist kleiner alsbytes_total
,(bytes_downloaded / bytes_total)
wird 0 sein, und Ihr Fortschritt wird daher immer 0 sein.Ändern Sie Ihre Berechnung in
den Fortschritt in ganzen (wenn auch bodengebundenen) Perzentilen zu erhalten.
quelle
division by zero
schwerwiegender Fehler angezeigt. Deshalb habe ich es so gemachtfinal int dl_progress = ( bytes_total > 0 ? (int) ((bytes_downloaded * 100L) / bytes_total) : 0 );
Pauls Antwort ist richtig, aber bei größeren Downloads werden Sie ziemlich schnell auf max int treffen und einen negativen Fortschritt erzielen. Ich habe dies verwendet, um das Problem zu lösen:
quelle
Wie Paul sagte, teilen Sie zwei ganze Zahlen, wobei das Ergebnis immer <1 ist.
Wirf immer deine Zahl vor dem Teilen, die im Gleitkomma berechnet und zurückgegeben wird.
Vergessen Sie nicht, mit DivByZero umzugehen.
quelle
Falls jemand die Implementierung des Download Progress Retrievers aus der Frage von @Victor Laerte in Kotlin mit RxJava benötigt, klicken Sie hier:
DownloadStateRetriever.kt
Ich habe dem Cursor Erweiterungen hinzugefügt, um die Codeklarheit zu verbessern:
CursorExtensions.kt
quelle