Mostrar el progreso de descarga dentro de la actividad usando DownloadManager

Intento reproducir el mismo progreso que DownloadManager muestra en la barra de notificaciones dentro de mi aplicación, pero mi progreso nunca se publica. Estoy intentando actualizarlo usando runOnUiThread (), pero por alguna razón no se ha actualizado.

mi descarga:

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

mi método 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); } 

Mi registro funciona a la perfección, mientras mi descarga se ejecuta, dice “¡Descarga en curso!” y cuando esté completo “¡Descarga completa!”, pero no ocurre lo mismo en mi progreso, ¿por qué? Realmente necesito ayuda, otras lógicas que hacer son muy apreciadas

Estás dividiendo dos enteros:

 final double dl_progress = (bytes_downloaded / bytes_total) * 100; 

Como bytes_downloaded es menor que bytes_total , (bytes_downloaded / bytes_total) será 0, y su progreso siempre será 0.

Cambie su cálculo a

 final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total); 

para obtener el progreso en percentiles completos (aunque con piso).

La respuesta de Paul es correcta, pero con mayores descargas, presionarás max int bastante rápido y comenzarás a obtener un progreso negativo. Lo usé para resolver el problema:

 final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total); 

Como dijo paul, estás dividiendo dos enteros, con el resultado siempre <1.

Siempre eche su número antes de dividir, que calcule y regrese en punto flotante.

No te olvides de manejar DivByZero.

 final int dl_progress = (int) ((double)bytes_downloaded / (double)bytes_total * 100f);