2017-10-04 109 views
0

IM文件上传和IM尝试使用进度而其上传progressdialog酒吧得到结冰

弗里斯特全部的我开始上载与此代码:

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

    } 
} 

然后uploadFile(selectedFilePath);从这里开始是我的部分代码:

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

再出之类的,我有这样的:

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

到目前为止,我认为它的工作,但它冻结了一些数字,如14/100,直到上传完成

回答

0

这里进度因为你正在处理UI线程上的繁重任务,所以你不应该在UI线程上处理繁重的任务,因为Bar处于冻结状态。代替这一点,你可以使用AsyncTask来达到这个目的。

Async task文档:

当执行一个异步任务,任务经过4个步骤:

1. onPreExecute()

2. doInBackground(Params ...)

3. onProgressUpdate(进展...)

4. onPostExecute(结果)

你可以阅读从这个Progress Dialog为好。