93 votes

Afficher la progression du Téléchargement à l'intérieur de l'activité à l'aide de DownloadManager

Je suis en train de reproduire les mêmes progrès que DownloadManager affiche dans la barre de Notification, à l'intérieur de mon application, mais mes progrès n'est jamais publié. Je suis en train de le mettre à jour à l'aide de runOnUiThread(), mais pour une raison quelconque, il n'est 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();

mon statusMessage méthode:

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 est en parfait état de marche, tandis que mon téléchargement est en cours d'exécution, dit "en cours de Téléchargement!" et quand il est terminé "Téléchargement terminé!", mais les mêmes ne se produit pas sur mes progrès, pourquoi? J'ai vraiment besoin d'aide, d'autres logiques sont vraiment appréciés

67voto

Paul Lammertsma Points 12817

Vous êtes à la division de deux entiers:

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

En tant que bytes_downloaded est inférieure à bytes_total, (bytes_downloaded / bytes_total) sera de 0, et votre progression sera donc toujours être 0.

Changer votre calcul

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

pour obtenir de l'avancement dans son ensemble (quoique parqueté) percentiles.

19voto

JustinMorris Points 2173

Paul réponse est correcte, mais avec de plus gros téléchargements, vous touchera max int assez rapide et commencer à obtenir un négatif progrès. J'ai utilisé ce pour résoudre le problème:

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

4voto

Dennis Cheung Points 11818

Comme paul l'a dit, vous êtes à la division de deux entiers, avec un résultat toujours <1.

Toujours jeter votre numéro avant de diviser, qui calculent et retour en float-point.

Ne pas oublier de traiter DivByZero.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X