2017-10-04 4 views
0

fichiers Uploading im et im essayant d'utiliser alors que son téléchargement progressbarProgressDialog bar se geler

Frist de tout ce que je commence le téléchargement avec ce code:

@Override 
public void onClick(View v) { 
    if(v== ivAttachment){ 

     //on attachment icon click 
     showFileChooser(); 
    } 
    if(v== bUpload){ 

     //on upload button Click 
     if(selectedFilePath != null){ 
      dialog = new ProgressDialog(upload.this); 
      dialog.setMax(100); 
      dialog.setMessage("Subiendo Archivo..."); 
      dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      dialog.setProgress(0); 
      dialog.show(); 

      //dialog.show(upload.this,"","Subiendo Archivo...",true); 

      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        //creating new thread to handle Http Operations 
        uploadFile(selectedFilePath); 
       } 
      }).start(); 

     }else{ 
      Toast.makeText(upload.this,"Escoge un archivo",Toast.LENGTH_SHORT).show(); 
     } 

    } 
} 

puis UploadFile (selectedFilePath); commence ici fait partie de mon code:

File sourceFile = new File(selectedFilePath); 
     int totalSize = (int)sourceFile.length(); 


     HttpURLConnection connection; 
     DataOutputStream dataOutputStream; 
     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 

     int bytesRead,bytesAvailable,bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 1 * 1024 * 1024; 
     File selectedFile = new File(selectedFilePath); 


     String[] parts = selectedFilePath.split("/"); 
     final String fileName = parts[parts.length-1]; 

     if (!selectedFile.isFile()){ 
      dialog.dismiss(); 

      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        tvFileName.setText("Source File Doesn't Exist: " + selectedFilePath); 
       } 
      }); 
      return 0; 
     }else{ 
      try{ 
       FileInputStream fileInputStream = new FileInputStream(selectedFile); 
       URL url = new URL(SERVER_URL); 
       connection = (HttpURLConnection) url.openConnection(); 
       connection.setDoInput(true);//Allow Inputs 
       connection.setDoOutput(true);//Allow Outputs 
       connection.setUseCaches(false);//Don't use a cached Copy 
       connection.setRequestMethod("POST"); 
       connection.setRequestProperty("Connection", "Keep-Alive"); 
       connection.setRequestProperty("ENCTYPE", "multipart/form-data"); 
       connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
       connection.setRequestProperty("uploaded_file",selectedFilePath); 

       //creating new dataoutputstream 
       dataOutputStream = new DataOutputStream(connection.getOutputStream()); 

       //writing bytes to data outputstream 
       dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); 
       dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" 
         + selectedFilePath + "\"" + lineEnd); 

       dataOutputStream.writeBytes(lineEnd); 

       //returns no. of bytes present in fileInputStream 
       bytesAvailable = fileInputStream.available(); 
       //selecting the buffer size as minimum of available bytes or 1 MB 
       bufferSize = Math.min(bytesAvailable,maxBufferSize); 
       //setting the buffer as byte array of size of bufferSize 
       buffer = new byte[bufferSize]; 

       //reads bytes from FileInputStream(from 0th index of buffer to buffersize) 
       bytesRead = fileInputStream.read(buffer,0,bufferSize); 


       int totalBytesWritten = 0; 
       Handler handler = new Handler(Looper.getMainLooper()); 

         //loop repeats till bytesRead = -1, i.e., no bytes are left to read 
         while (bytesRead > 0) { 

          //write the bytes read from inputstream 
          dataOutputStream.write(buffer, 0, bufferSize); 
          bytesAvailable = fileInputStream.available(); 
          bufferSize = Math.min(bytesAvailable, maxBufferSize); 
          bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

           totalBytesWritten += bytesRead; 
          handler.post(new ProgressUpdater(totalBytesWritten, totalSize)); 

         } 

       dataOutputStream.writeBytes(lineEnd); 
       dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

ensuite de la classe j'ai ceci:

private class ProgressUpdater implements Runnable { 
     private long mUploaded; 
     private long mTotal; 
     public ProgressUpdater(long uploaded, long total) { 
      mUploaded = uploaded; 
      mTotal = total; 
     } 

     @Override 
     public void run() { 
      onProgressUpdate((int)(100 * mUploaded/mTotal)); 
     } 
    } 


    public void onProgressUpdate(int percentage) { 
     // set current progress 
     dialog.setProgress(percentage); 
    } 

Jusqu'à présent, je pense que son travail, mais il gèle sur un certain nombre comme 14/100 jusqu'à ce que le téléchargement termine

Répondre

0

Ici, la barre de progression se bloque car vous traitez une lourde tâche sur le thread UI et dans Android, vous ne devez pas traiter les tâches lourdes sur le thread UI. Au lieu de cela, vous pouvez utiliser AsyncTask.

De la documentation Async task:

Lorsqu'une tâche asynchrone est exécutée, la tâche passe par 4 étapes:

1. OnPreExecute()

2. doInBackground (Params ...)

3. onProgressUpdate (Progress ...)

4. onPostExecute (Résultat)

Vous pouvez lire Progress Dialog de cela aussi.