2013-04-03 29 views
63

Sto provando a riprodurre gli stessi progressi che DownloadManager mostra nella barra di notifica all'interno della mia app, ma i miei progressi non vengono mai pubblicati. Sto cercando di aggiornarlo usando runOnUiThread(), ma per qualche motivo non è stato aggiornato.Mostra avanzamento download all'interno dell'attività DownloadManager

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

mio metodo 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); 
} 

mio registro è perfettamente funzionante, mentre il mio download è in esecuzione dice "! Scarica in corso" e quando è completo "Download completo!", ma lo stesso non si verifica sui miei progressi, perché? Io ho bisogno di aiuto, altre logiche di fare che sono molto apprezzato

+0

Potrebbe essere che il file sia semplicemente troppo piccolo e che il download sia completato prima della pubblicazione dello stato di avanzamento? Cosa restituisce la query di download nell'attività? Se l'attività viene eseguita solo dopo un certo periodo di tempo, è possibile che ci siano altre operazioni di lunga durata sul thread principale. –

+0

Ho aggiornato il codice, puoi dare un'occhiata ora? E sulla lunghezza del file non è troppo piccolo, posso vedere i progressi del download sulla barra di notifica –

risposta

40

Si divide due numeri interi:

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

Come bytes_downloaded è inferiore a bytes_total, (bytes_downloaded/bytes_total) sarà 0, e il vostro progresso sarà quindi sempre essere 0.

Cambia il calcolo per

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

per ottenere il progr in percentili interi (anche se pavimentati).

+0

@AZ_ Grazie per il tuo contributo. Ti suggerirei di aggiungere la tua risposta con la soluzione più elaborata. –

+0

Va bene non voglio mettere un'altra risposta di risposta già accettata perché sarà difficile per gli utenti. Puoi scegliere di non accettare la mia modifica :) –

14

La risposta di Paul è corretta ma con download più grandi si otterrà un int max abbastanza veloce e si inizierà a ottenere un progresso negativo. Ho usato questo per risolvere il problema:

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

Hai ragione; Ho modificato la mia risposta per assicurarmi che gli altri non commettano lo stesso errore. –

5

come Paul ha detto, si divide due numeri interi, con esito sempre < 1.

sempre gettato il tuo numero di prima divide, che calcolano e ritorno in virgola mobile.

Non dimenticare di gestire DivByZero.

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