2013-06-27 9 views
8
Şu anda benim uygulama içindeki arka planda büyük bir dosya indirmek için AsyncTask kullanıyorum

, şu anda indirme ilerleme olarak aşağıda onProgressUpdate olarak güncellenen bir ProgressDialog olarak gösterilir: Bu şimdi ancak, iyi çalışıyorDosya indirilirken Bildirim güncellenirken UI gecikmesi nasıl önlenir?

protected String doInBackground(String... sUrl) { 
     try { 
      String destName = sUrl[1]; 
      file_Delete(destName); // Just to make sure! 

      URL url = new URL(sUrl[0]); 
      URLConnection connection = url.openConnection(); 
      connection.connect(); 
      int fileLength = connection.getContentLength(); 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream(destName); 

      byte data[] = new byte[1024]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       total += count; 
       publishProgress((int) (total * 100/fileLength)); 
       output.write(data, 0, count); 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 

     } catch (Exception e) { 
      Log.e(TAG, NAME + ": Error downloading file! " + e.getMessage()); 
      return e.getMessage(); 
     } 

     return null; 
    } 

@Override protected void onProgressUpdate(Integer... progress) { 
     super.onProgressUpdate(progress); 
     DownloadImage.mProgressDialog.setProgress(progress[0]); 


    } 

bildirim çubuğunda bir bildirim kullanmak istiyorsanız, indirme işlemini takip edin (dosya oldukça büyük olabilir ve kullanıcılar uygulamanın dışından takip etmek isterler).

Ben aşağıdaki kodu denedim

ancak kullanıcı arayüzüne çok adlandırılan alma publishProgress onun yüzünden görebilirsiniz kötü gecikme başlar, böylece nasıl publishProgress sadece her saniye

@Override protected void onProgressUpdate(Integer... progress) { 
     super.onProgressUpdate(progress); 
     DownloadImage.mProgressDialog.setProgress(progress[0]); 

     DownloadImage.myNotification = new NotificationCompat.Builder(c) 
     .setContentTitle("Downloading SlapOS") 
     .setContentText("Download is " + progress[0] + "% done") 
     .setTicker("Downloading...") 
     .setOngoing(true) 
     .setWhen(System.currentTimeMillis()) 
     .setProgress(100, progress[0], false) 
     .setSmallIcon(R.drawable.icon) 
     .build(); 

     DownloadImage.notificationManager.notify(1, DownloadImage.myNotification); 

    } 
çağırmak için arka plan kodu değiştirme hakkında gidebiliriz
+0

Şu anda hangi sürümü çalıştırıyorsunuz? – JPM

+0

Min SDK sürümü 8, ancak 4.2.1 çalıştıran bir aygıtta ve her ikisi de aynı sonuçla 2.3.4 çalıştıran bir aygıt üzerinde test ettim (sistemUI çöktüğünde ve yeniden başlatılana kadar UI söner) –

cevap

14

yüzden nasıl publishProgress çağırmak için arka plan Kodun değiştirilmesi ile ilgili gidebiliriz sadece her saniye

Benyılında% gösterdi bir yükleme fonksiyonu için daha önce yapmış, ama aynı kesin fikir. Senin AsyncTask, percentDone download vedeğiştirir publishProgress çağrı takip edin. Bu şekilde, yalnızca indirilen değişiklikler% publishProgress'u arayacaksınız ve Notification bu nedenle güncellenmesi gerekiyor. Bu UI gecikmesini çözmelidir.

Bunu önerdiğim uygulama olarak yazıyordum, çünkü OP zaten çalışıyor. Ama belki bu gelecekte başkası yardımcı olacaktır:

byte data[] = new byte[1024]; 
    long total = 0; 
    int count, latestPercentDone; 
    int percentDone = -1; 
    while ((count = input.read(data)) != -1) { 
     total += count; 
     latestPercentDone = (int) Math.round(total/fileLength * 100.0); 
     if (percentDone != latestPercentDone) { 
      percentDone = latestPercentDone; 
      publishProgress(percentDone); 
     } 
     output.write(data, 0, count); 
    } 
+0

Mükemmel gecikme çözüldü! –

+0

Bu benim ihtiyaçlar için de yeterince iyi – brux

+0

Benim için de sabit gecikmeler! – VSG24

0

Gerçekten bu yaklaşımınızı sevdim! Aşağıdaki kodu değiştirerek ilerleme çubuğu güncellememi doğru şekilde yaptığını buldum. Math.round() kullanırken bazı sorunlar yaşadım.

latestPercentDone = (int) ((dataBytesWritten/(float) totalSize) * 100); 
    if (percentDone != latestPercentDone) { 
    percentDone = latestPercentDone; 
    publishProgress(percentDone); 
    } 
+0

Bu, kabul edilen cevaba yeni hiçbir şey eklemiyor. – VSG24

İlgili konular