在AsyncTask中更新进度条会降低上传速度

时间:2013-09-26 00:22:16

标签: android

我正在使用AsyncTask将图像上传到网络服务器,当我阻止更新进度条的方法时,它会减慢上传速度。但是如果没有循环更新程序的进度条,它会在几秒钟内(非常快)上传图像。以下是我用来更新进度条的代码:

  bufferSize = Math.min(bytesAvailable, maxBufferSize);
  mFileLen =  file.length();

  for (int i = 0; i < bufferSize; i++) {
                publishProgress((int) ((i / (float) mFileLen) * 100));
            } 

无论如何我可以更新进度条而不会导致操作变慢吗?

2 个答案:

答案 0 :(得分:2)

一些想法:

  1. 您不需要在循环的每次迭代中设置progressBar1 max,因为bufferSize在循环内部没有变化,所以没有意义。将该命令移出循环。
  2. 尝试记住您之前的进度:prevProgress = (i / mFileLen)。然后衡量您的新进度:currProgress = (i / mFileLen)。然后,如果两个进程之间的差异不大于0.01(1%),请不要更新UI:if (currProgress - prevProgress >= 0.01) publishProgress(...);
  3. 以下是一个例子:

            float currProgress = 0;
            float prevProgress = 0;
            for (int i = 0; i < bufferSize; i++) 
            {
                currProgress = ((float)i / (float) mFileLen);
    
                if (currProgress - prevProgress >= 0.01)
                {
                    publishProgress((int) (currProgress * 100));
                    prevProgress = currProgress;
                }
            } 
    

    当进度大于2%(0.02)而不是1%(0.01)等时,您可以通过更新UI来更快地工作。

    另外,我觉得imFileLen之间没有真正的相关性......你的bufferSize是什么?它是否小于mFileLen(应该是)。在这种情况下,您应该使用单独的变量来计算它使用的整体进度,而不是i来衡量进度。

    希望这有帮助。

答案 1 :(得分:2)

提醒一下,您可以将数据发送到IntentService中的Web服务器,这也是异步的。如果用户不必立即处理操作结果,则首选IntentService。这完全是背景。另一方面,您可以发布通知。问自己这些问题:

  1. 即使用户更改设备方向,我是否希望此操作继续? (如果活动被销毁,Asynctask将停止; IntentService将不会停止。)
  2. 相反,我是否介意操作必须重新加载(AsyncTask更简单一点)。
  3. 我是否存储持久数据(使用IntentService甚至绑定服务和SyncAdapter)
  4. 用户是否需要在操作完成时保持不变(如果是,AsyncTask在完成时会提供更多即时反馈。如果不是,IntentService与应用程序的活动有点断开连接,因此它可以随着其他东西欢快地流失正在发生。