2017-03-28 2 views
0

Ich lade eine MP3-Datei aus dem Internet herunter und speichere sie im internen Speicher. Der Fortschritt des Downloads wird in einer ProgressDialog angezeigt. Die ProgressDialog zeigt den Fortschritt in Prozent an, was in Ordnung ist. Rechts wird der Fortschritt als 1/100 angezeigt .... Ich möchte, dass die aktuelle Größe der heruntergeladenen Datei in MB angezeigt wird/die Gesamtgröße der heruntergeladenen Datei in MB.Datei Download-Fortschritt in MB anzeigen

Wie in der folgenden Abbildung. Der graue Text ist der aktuelle Text, der angezeigt wird. Ich möchte, dass es wie der Text darunter rot angezeigt wird.

enter image description here

Hier ist der aktuelle Code:

public class DownloadSKHindi extends AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     progressDialog = new ProgressDialog(getActivity()); 
     progressDialog.setMessage("Downloading"); 
     progressDialog.setMax(100); 
     progressDialog.setCancelable(false); 
     progressDialog.setCanceledOnTouchOutside(false); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     progressDialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     int count = 0; 
     try { 
      url = new URL(skURL[10]); 

      connection = url.openConnection(); 
      connection.connect(); 

      int lengthOfFile = connection.getContentLength(); 

      InputStream input = new BufferedInputStream(url.openStream()); 

      OutputStream output = getActivity().openFileOutput(file.getPath(), Context.MODE_PRIVATE); 

      byte data[] = new byte[1024]; 

      long total = 0; 

      while ((count = input.read(data)) != -1) { 
       total += count; 

       publishProgress((int) (total * 100/lengthOfFile)); 
       output.write(data, 0, count); 
      } 

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

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     progressDialog.setProgress(values[0]); 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     progressDialog.dismiss(); 
    } 
} 
+0

Sie einige Berechnung tun müssen. erste Dateigröße erhalten und dann jedes Prozent in Byte prüfen und konvertiert sie dann MB –

+0

@Devansh Wie Größe zu finden, ** Gesamt ** und ** ** lengthOfFile –

+1

@GowthamanM wie Sie oben sehen können, 'lengthOfFile' erhalten indem ich die Länge der Datei erhalte, mit der ich mich verbinde. Also, welche Datei Sie auch immer mit der AsyncTask herunterladen möchten, verwenden Sie einfach 'connection.getContentLength();' für 'lengthOfFile'. "total" zeigt an, wie viel von der Datei heruntergeladen wurde. Der Code ist schon da für ihn über – Devansh

Antwort

1

Unter der Annahme, total ist, wie viele Bytes heruntergeladen und lengthOfFile ist die Größe in Bytes, wie groß die Datei ist. Sie können dies tun:

progressDialog.setProgressNumberFormat((bytes2String(total)) + "/" + (bytes2String(lengthOfFile))); 

Dann die Funktion bytes2String mit (Credit coder)

private static double SPACE_KB = 1024; 
private static double SPACE_MB = 1024 * SPACE_KB; 
private static double SPACE_GB = 1024 * SPACE_MB; 
private static double SPACE_TB = 1024 * SPACE_GB; 

public static String bytes2String(long sizeInBytes) { 

    NumberFormat nf = new DecimalFormat(); 
    nf.setMaximumFractionDigits(2); 

    try { 
     if (sizeInBytes < SPACE_KB) { 
      return nf.format(sizeInBytes) + " Byte(s)"; 
     } else if (sizeInBytes < SPACE_MB) { 
      return nf.format(sizeInBytes/SPACE_KB) + " KB"; 
     } else if (sizeInBytes < SPACE_GB) { 
      return nf.format(sizeInBytes/SPACE_MB) + " MB"; 
     } else if (sizeInBytes < SPACE_TB) { 
      return nf.format(sizeInBytes/SPACE_GB) + " GB"; 
     } else { 
      return nf.format(sizeInBytes/SPACE_TB) + " TB"; 
     } 
    } catch (Exception e) { 
     return sizeInBytes + " Byte(s)"; 
    } 

} 

Source

+0

So finden Sie die Größe von ** total ** und ** lengthOfFile ** –

1

Verwenden TextView, die nach progressDialog innerhalb XML-Datei angehängt wird. Betrachten TextView tv = findViewById();

Verwenden Sie diese: publishProgress((int) (total * 100/lengthOfFile), total ,lengthOfFile);, um neue Daten zu pushen.

Und die tv Gebrauch zu aktualisieren diese:

@Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
     progressDialog.setProgress(values[0]); 
tv.setText((values[1]/(1024*1024)) + "" +(values[1]/(1024*1024))); 
    } 
+0

Sie sollten die 'TextView' nicht benötigen, Sie können' ProgressBar # setProgressNumberFormat' verwenden. – JediBurrell

+0

@JediBurrell, interessante Idee, aber er will roten riesigen Text – Vyacheslav

+0

Ich bin mir ziemlich sicher, dass das nur das Beispiel war. Ich könnte mich jedoch irren. – JediBurrell

Verwandte Themen