J'essaie de reproduire la même progression que celle de DownloadManager dans la barre de notification de mon application, mais ma progression n'est jamais publiée. J'essaie de le mettre à jour en utilisant runOnUiThread (), mais pour une raison quelconque, il n'a pas été mis à jour.
mon téléchargement:
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();
ma méthode statusMessage:
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);
}
Mon journal fonctionne parfaitement, tandis que mon téléchargement est en cours d'exécution dit "Téléchargement en cours!" et quand il est terminé "Téléchargement terminé!", mais que la même chose ne se produit pas sur ma progression, pourquoi? J'ai vraiment besoin d'aide, d'autres logiques à faire qui sont vraiment appréciées
android
progress-bar
Victor Laerte
la source
la source
Réponses:
Vous divisez deux entiers:
As
bytes_downloaded
est inférieur àbytes_total
,(bytes_downloaded / bytes_total)
sera 0, et votre progression sera donc toujours 0.Modifiez votre calcul en
pour obtenir la progression en percentiles entiers (quoique plancher).
la source
division by zero
erreur fatale. C'est pourquoi je l'ai fait commefinal int dl_progress = ( bytes_total > 0 ? (int) ((bytes_downloaded * 100L) / bytes_total) : 0 );
La réponse de Paul est correcte, mais avec des téléchargements plus importants, vous atteindrez max int assez rapidement et commencerez à obtenir une progression négative. J'ai utilisé ceci pour résoudre le problème:
la source
Comme Paul l'a dit, vous divisez deux entiers, avec un résultat toujours <1.
Cast toujours votre nombre avant la division, qui calcule et retourne en virgule flottante.
N'oubliez pas de gérer DivByZero.
la source
Si quelqu'un a besoin de l'implémentation du récupérateur de progression du téléchargement à partir de la question de @Victor Laerte dans Kotlin avec RxJava, allez-y:
DownloadStateRetriever.kt
J'ai ajouté des extensions au curseur pour plus de clarté du code:
CursorExtensions.kt
la source