【问题标题】:Progress bar not synchronous with file upload in Android application进度条与 Android 应用程序中的文件上传不同步
【发布时间】:2014-07-26 06:44:26
【问题描述】:

我正在尝试通过 Android 应用程序中的 POST 方法使用以下代码上传文件,并且效果很好。如果我尝试在 while 正文 (mNotificationHelper.progressUpdate(sentBytes)) 中显示刷新的进度条,我注意到它与文件上传不同步,但它显示相对于写入的百分比 DataOutputStream 。 当 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);

【问题讨论】:

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

标签: android file post upload


【解决方案1】:

当您遇到 UI 问题时,请始终使用 Log 来调试实际值,在您的情况下,您填充了一个缓冲区,所以我猜它“太快”而无法在您的进度条上显示。

我相信你必须设置

connection.setChunkedStreamingMode(maxBufferSize);

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

【讨论】:

    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2023-03-29
    • 2022-01-02
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多