进度条与Android应用程序中的文件上载不同步

进度条与Android应用程序中的文件上载不同步,android,file,post,upload,Android,File,Post,Upload,我正试图通过Android应用程序中的POST方法上传一个文件,代码如下,效果良好。如果我尝试在while body中显示刷新的进度条(mNotificationHelper.progressUpdate(sentBytes)),我注意到它与文件上载不同步,但它显示相对于写入数据输出流的百分比。 当while块结束时,上传就真正开始了。看起来,DataOutputStream首先将块保存在本地,然后最后将它们全部上载。。。但此时,进度条已经完成。所以它就像一个假进度条。 有什么想法吗 Http

我正试图通过Android应用程序中的POST方法上传一个文件,代码如下,效果良好。如果我尝试在while body中显示刷新的进度条(mNotificationHelper.progressUpdate(sentBytes)),我注意到它与文件上载不同步,但它显示相对于写入数据输出流的百分比。 当while块结束时,上传就真正开始了。看起来,DataOutputStream首先将块保存在本地,然后最后将它们全部上载。。。但此时,进度条已经完成。所以它就像一个假进度条。 有什么想法吗

 HttpsURLConnection conn = null;
 DataOutputStream dos = null;
 String lineEnd = "\r\n";
 String twoHyphens = "--";
 String boundary = "*****";
 int bytesRead, bytesAvailable, bufferSize;
 byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;           

dos = new DataOutputStream(conn.getOutputStream());                        


long fileSize = sourceFile.length();


bytesAvailable = fileInputStream.available(); 

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


int sentBytes = 0;
sentBytes += bytesRead;

     while (bytesRead > 0) {

          dos.write(buffer, 0, bufferSize);
              bytesAvailable = fileInputStream.available();

                      // progressbar refreshed in Notification 
              mNotificationHelper.progressUpdate(sentBytes);

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

                sentBytes += bytesRead;

                        }


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



                  serverResponseCode = conn.getResponseCode();
                  String serverResponseMessage = conn.getResponseMessage();

    Log.i("uploadFile", "HTTP Response is : "
                               + serverResponseMessage + ": " + serverResponseCode);

当您遇到UI问题时,总是使用Log来调试实际值,在您的情况下,您会填充一个缓冲区,因此我想它“太快”了,无法在进度条上显示

我相信你一定会成功的

connection.setChunkedStreamingMode(maxBufferSize);

要“一包一包”地发送数据,而不是填充缓冲区,然后发送整个缓冲区。

当用户界面出现问题时,请始终使用日志调试实际值,在您的情况下,填充缓冲区,因此我想它“太快”了,无法在进度条上显示

我相信你一定会成功的

connection.setChunkedStreamingMode(maxBufferSize);

要“一包一包”地发送数据,而不是填充缓冲区,然后发送整个缓冲区。

当用户界面出现问题时,请始终使用日志调试实际值,在您的情况下,填充缓冲区,因此我想它“太快”了,无法在进度条上显示

我相信你一定会成功的

connection.setChunkedStreamingMode(maxBufferSize);

要“一包一包”地发送数据,而不是填充缓冲区,然后发送整个缓冲区。

当用户界面出现问题时,请始终使用日志调试实际值,在您的情况下,填充缓冲区,因此我想它“太快”了,无法在进度条上显示

我相信你一定会成功的

connection.setChunkedStreamingMode(maxBufferSize);


要“一包一包”地发送数据,而不是填充缓冲区,然后发送整个缓冲区。

我猜您是在Asyntask中执行此操作的。我正在Android服务启动的线程中运行它,考虑使用AsyncTask?问题是progressbar刷新工作正常,但显示写入缓冲区的值(在while正文中)。当缓冲区通过网络写入时,进度条已经完成。在上面的代码行中,您在哪里关闭进度条?我猜您是在AsynTaskI中执行此操作的,我正在Android服务启动的线程中运行它考虑使用AsyncTask?问题是进度条刷新工作正常,但是显示写入缓冲区的值(在while主体中)。当缓冲区通过网络写入时,进度条已经完成。在上面的代码行中,您在哪里关闭进度条?我猜您是在AsynTaskI中执行此操作的,我正在Android服务启动的线程中运行它考虑使用AsyncTask?问题是进度条刷新工作正常,但是显示写入缓冲区的值(在while主体中)。当缓冲区通过网络写入时,进度条已经完成。在上面的代码行中,您在哪里关闭进度条?我猜您是在AsynTaskI中执行此操作的,我正在Android服务启动的线程中运行它考虑使用AsyncTask?问题是进度条刷新工作正常,但是显示写入缓冲区的值(在while主体中)。当通过网络写入缓冲区时,进度条已经完成。关闭进度条的行代码在上面的哪里?