进度条会重置吗?

时间:2013-04-04 22:39:09

标签: java android progress-bar

当我上传超过5MB的文件时,进度条在达到4%时自动重置,并从每10秒开始0。但是,对于5MB以下的文件,进度条工作正常并达到100%

这是因为maxBufferSize吗?服务器最大邮件大小为512MB,其他任何东西都是无限制的,所以问题必须来自我的代码,但我不知道在哪里。

这是我的代码

@Override
protected void onProgressUpdate(Integer... progress) {
         super.onProgressUpdate(progress);

     //update Dialog box progress   
     mProgressDialog.setProgress(progress[0]); 
        if ( nofti_appended )
        {       
         //update Notification progress
          mBuilder.setProgress(100, progress[0], false);
        }
}


protected String doInBackground(String... urls) {    
            String upLoadServerUri = upApi.uploadUrl;
            String fileName = this.file_path;
            HttpURLConnection connection = null;
            DataOutputStream outputStream = null;
            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary = "*****";
            int bytesRead, bytesAvailable, bufferSize;
            byte[] buffer;
            int maxBufferSize =  1*1024*1024;
            File sourceFile = new File(fileName);
            int sentBytes = 0;
            long fileSize = sourceFile.length();

             try
                {
                    FileInputStream fileInputStream = new FileInputStream(new File(fileName));

                    URL url = new URL(upLoadServerUri);
                    connection = (HttpURLConnection) url.openConnection();

                    // Allow Inputs & Outputs
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
                    connection.setUseCaches(false);
                    connection.setChunkedStreamingMode(1024);
                    // Enable POST method
                    connection.setRequestMethod("POST");

                    connection.setRequestProperty("Connection", "Keep-Alive");
                    connection.setRequestProperty("Content-Type",     "multipart/form-data;boundary="+boundary);

                    outputStream = new DataOutputStream(     connection.getOutputStream() );
                    outputStream.writeBytes(twoHyphens + boundary + lineEnd);
                    outputStream.writeBytes("Content-Disposition: form-data; name=\"file[]\";filename=\""+ fileName + "\"" + lineEnd);
                    outputStream.writeBytes(lineEnd);

                    bytesAvailable = fileInputStream.available();
                    Log.v("Size",bytesAvailable+"");

                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    buffer = new byte[bufferSize];


                    // Read file
                    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                    while (bytesRead > 0)
                    {

                        if(isCancelled()){

                            break;
                        }

                        sentBytes += bytesRead;
                        publishProgress((int)(sentBytes * 100 / fileSize));

                        outputStream.write(buffer, 0, bufferSize);

                        bytesAvailable = fileInputStream.available();

                        bufferSize = Math.min(bytesAvailable,     maxBufferSize);
                        bytesRead = fileInputStream.read(buffer, 0,      bufferSize);
                    }


                   if(isCancelled()){

                        return "faild";
                    }

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

                     Scanner s;
                     s = new Scanner(connection.getInputStream());
                     s.useDelimiter("\\Z");
                     final String response = s.next();

                    // Responses from the server (code and message)
                    int serverResponseCode       = connection.getResponseCode();

                    fileInputStream.close();
                    outputStream.flush();
                    outputStream.close();

                    if(serverResponseCode == 200)
                     {
                        return response;
                     }


                } catch (MalformedURLException ex) {

                } catch (final Exception e) {

                }

            return "faild";
        }

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为你的进度计算实际上有两个问题:

首先,你的逻辑并不完全正确。它应该是(见下一段的原因):

(sentBytes / fileSize) * 100

第二个问题是,您使用int值,但尝试进行浮点计算。 (百分比为0.01 - 1.00,然后乘以100将其转换为1% - 100%。)您需要将计算作为浮动计算指向,然后将最终值转换为整数。

尝试类似

的内容
publishProgress((int)(((sentBytes * 1.0) / fileSize) * 100)));

然而,这将成为很多()对。最好声明一个单独的floatdouble变量,然后使用它:

percentDone = (sentBytes * 1.0) / fileSize * 100;
publishProgress((int)percentDone);