我正在使用AsyncTask将图像上传到网络服务器,当我阻止更新进度条的方法时,它会减慢上传速度。但是如果没有循环更新程序的进度条,它会在几秒钟内(非常快)上传图像。以下是我用来更新进度条的代码:
bufferSize = Math.min(bytesAvailable, maxBufferSize);
mFileLen = file.length();
for (int i = 0; i < bufferSize; i++) {
publishProgress((int) ((i / (float) mFileLen) * 100));
}
无论如何我可以更新进度条而不会导致操作变慢吗?
答案 0 :(得分:2)
一些想法:
progressBar1
max,因为bufferSize
在循环内部没有变化,所以没有意义。将该命令移出循环。prevProgress = (i / mFileLen)
。然后衡量您的新进度:currProgress = (i / mFileLen)
。然后,如果两个进程之间的差异不大于0.01(1%),请不要更新UI:if (currProgress - prevProgress >= 0.01) publishProgress(...);
以下是一个例子:
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来更快地工作。
另外,我觉得i
和mFileLen
之间没有真正的相关性......你的bufferSize
是什么?它是否小于mFileLen
(应该是)。在这种情况下,您应该使用单独的变量来计算它使用的整体进度,而不是i
来衡量进度。
希望这有帮助。
答案 1 :(得分:2)
提醒一下,您可以将数据发送到IntentService中的Web服务器,这也是异步的。如果用户不必立即处理操作结果,则首选IntentService。这完全是背景。另一方面,您可以发布通知。问自己这些问题: