2013-04-03 23 views
63

Uygulamamdaki Bildirim çubuğunda DownloadManager'ın gösterdiği aynı ilerlemeyi yeniden oluşturmaya çalışıyorum, ancak ilerlemem hiç yayınlanmadı. Ben runOnUiThread() kullanarak güncellemeye çalışıyorum, ancak bazı sebeplerden dolayı güncellenmedi.Göster İndirme işleminin içinden geçme işlemini DownloadManager'ı kullanarak indirin

my indir:

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

benim StatusMessage yöntemi:

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); 
} 
benim indir çalışırken Benim günlüğü, mükemmel çalışıyor "! Progress İndirme" diyor

ve tamamlandığında "İndirme tamamlandı!", ancak ilerlememde aynı şey gerçekleşmiyor, neden? Gerçekten gerçekten iki tamsayı bölünüyor

+0

Dosyanız çok küçük olabilir ve bu ilerleme kaydedilmeden önce tamamlanır mı? İndirme sorgusu görevinizde ne döndürür? Görev yalnızca belirli bir süre sonra yürütülürse, ana iş parçanızda uzun süren başka bir işleminiz olabilir. –

+0

Kodu güncelledim, şimdi bir bakabilir misin? Ve dosya uzunluğu hakkında çok küçük değil, bildirim çubuğunda indirme ilerlemesini görebiliyorum –

cevap

40

takdir edilmektedir bunu yapmak için, diğer mantığı biraz yardıma ihtiyacım: bytes_downloaded gibi

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

bytes_total azdır, (bytes_downloaded/bytes_total) 0 olacak ve ilerleme olacaktır bu nedenle her zaman 0.

progr elde etmek

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

için hesaplama değiştirin

olmak (her ne kadar olsa da) yüzdelik (yüzde).

+0

@AZ_ Katkınız için teşekkürler. Daha ayrıntılı bir çözümle kendi cevabınızı eklemenizi öneririm. –

+0

Tamam, kabul edilmiş bir cevabın başka bir cevabı koymak istemiyorum çünkü kullanıcılar için zor olacak. Düzenlememi kabul etmemeyi tercih edebilirsiniz :) –

14

Paul'ün cevabı doğrudur, ancak daha büyük indirmelerle, max int'ye hızlıca bastığınızda olumsuz bir ilerleme kaydedersiniz. Sorunu çözmek için bu kullandı: paul daima Daima < 1.

hesaplamak uçurum ve dönmeden önce Numaranızı dökme, sen sonuçla, iki tamsayı bölen edilir söylediği gibi

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

Haklısınız; Başkalarının aynı hatayı yapmadığından emin olmak için cevabımı değiştirdim. –

5

float noktasında.

DivByZero'yu kullanmayı unutmayın.

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