2017-08-07 2 views
0

Hallo ich bekomme ZIP-Datei vom Server und ich habe Code dafür geschrieben.ProgressDialog funktioniert nicht einwandfrei

Ich zeige progressdialog auch

Hier Code

public class DownloadImageFromUrl : AsyncTask<string, string, string> 
{ 
    private ProgressDialog pd; 
    private Context context; 

    public DownloadImageFromUrl(Context context) 
    { 
     this.context = context; 
    } 

    protected override void OnPreExecute() 
    { 
     pd = new ProgressDialog(context); 

     pd.SetMessage("Downloading file. Please wait..."); 

     pd.Indeterminate = false; 

     pd.Max = 100; 

     pd.SetProgressStyle(ProgressDialogStyle.Horizontal); 

     pd.SetCancelable(true); 

     pd.Show(); 

     base.OnPreExecute(); 

    } 

    protected override void OnProgressUpdate(params string[] values) 
    { 
     base.OnProgressUpdate(values); 

     pd.SetProgressNumberFormat(values[0]); 
     Log.Verbose("values", "" + values[0]); 
     pd.Progress = int.Parse(values[0]); 

    } 

    protected override void OnPostExecute(string result) 
    { 
     pd.Dismiss(); 
    } 

    protected override string RunInBackground(params string[] @params) 
    { 

     var storagePath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads); 
     string filePath = System.IO.Path.Combine(storagePath.AbsolutePath, "testfile.zip"); 
     int count; 

     try 
     {      
      URL url = new URL("http://shadikidukan.co.in/abhi/AAA.zip"); 
      filename = Path.GetFileName(new Uri(url.ToString()).AbsolutePath); 
      System.Console.WriteLine("Abhijir" + filename); 
      URLConnection connection = url.OpenConnection(); 

      connection.Connect(); 

      int LengthOfFile = connection.ContentLength;//Here connection.ContentLength return -1 
      Log.Verbose("length", ""+LengthOfFile); 
      InputStream input = new BufferedInputStream(url.OpenStream(), 8192); 

      OutputStream output = new FileOutputStream(filePath); 

      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 (Exception e) 

      { 

       System.Console.WriteLine("Abhijir"+e.Message); 
      } 
      return null; 

     } 

    } 

connection.ContentLength return -1

und wenn die Datei heruntergeladen wird es negative Werte angezeigt werden und Fortschritte Inkrementieren nicht ..

in progressupdate Methode es immer negative Werte

erhalten
protected override void OnProgressUpdate(params string[] values) 
{ 
    base.OnProgressUpdate(values); 

    pd.SetProgressNumberFormat(values[0]); 
    Log.Verbose("values", "" + values[0]);//values[0] has negative values 
    pd.Progress = int.Parse(values[0]); 

} 

wie dieses Problem zu überwinden und richtigen Wert in progressdialog anzuzeigen.

Antwort

1

Eine Inhaltslänge von -1 zeigt an, dass der Header fehlt oder ignoriert werden soll. Dies bedeutet normalerweise, dass der Server chunked transfer encoding verwendet. Pro Design können Sie die Gesamtlänge der Datei, die Sie herunterladen möchten, nicht kennen und daher kann keine Fortschrittsanzeige angezeigt werden.

Versuchen Sie, die Datei in einem Desktop-Browser herunterzuladen, Sie werden sehen, dass die Gesamtlänge nicht angezeigt wird, bis die Übertragung beendet ist.

+0

Was ist die Lösung dafür Sir –

+0

Es gibt keine Lösung. Wie ich schon sagte, können Sie wegen der Art und Weise, wie das Protokoll selbst entworfen wird, keine Inhaltslänge erhalten. Wenn es sich um Ihren Server handelt, ändern Sie die Konfiguration so, dass keine Chunked-Übertragung mehr verwendet wird. Wenn nicht, dann steckst du fest. –

+0

Ya ist mein Server können Sie mir sagen, wie man die Konfiguration ändern kann –

Verwandte Themen