Android 在AsyncTask中更新progressbar会降低上载速度
我使用AsyncTask将图像上载到Web服务器,当我强制使用一种方法更新progressbar时,它会减慢上载速度。但是如果没有progressbar的循环更新程序,它会在几秒钟内上载图像(非常快)。下面是我用来更新progressbar的代码:Android 在AsyncTask中更新progressbar会降低上载速度,android,Android,我使用AsyncTask将图像上载到Web服务器,当我强制使用一种方法更新progressbar时,它会减慢上载速度。但是如果没有progressbar的循环更新程序,它会在几秒钟内上载图像(非常快)。下面是我用来更新progressbar的代码: bufferSize = Math.min(bytesAvailable, maxBufferSize); mFileLen = file.length(); for (int i = 0; i < bufferSize; i+
bufferSize = Math.min(bytesAvailable, maxBufferSize);
mFileLen = file.length();
for (int i = 0; i < bufferSize; i++) {
publishProgress((int) ((i / (float) mFileLen) * 100));
}
bufferSize=Math.min(字节可用,maxBufferSize);
mfilen=file.length();
for(int i=0;i
我是否可以在不降低操作速度的情况下更新progressbar?一些想法:
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;
}
}
float currProgress=0;
浮动进度=0;
for(int i=0;i=0.01)
{
出版进度((国际)(当前进度*100));
prevProgress=当前进度;
}
}
当进度大于2%(0.02)而不是1%(0.01)时,可以通过更新UI使其工作得更快
而且,我觉得I
和mfilen
之间没有真正的相关性。。。您的缓冲区大小是多少?是否小于mFileLen
(应为)。在这种情况下,您应该使用单独的变量来计算总体进度,而不是使用i
来测量进度
希望这能有所帮助。一些想法:
您不需要在循环的每次迭代中设置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;
}
}
float currProgress=0;
浮动进度=0;
for(int i=0;i=0.01)
{
出版进度((国际)(当前进度*100));
prevProgress=当前进度;
}
}
当进度大于2%(0.02)而不是1%(0.01)时,可以通过更新UI使其工作得更快
而且,我觉得I
和mfilen
之间没有真正的相关性。。。您的缓冲区大小是多少?是否小于mFileLen
(应为)。在这种情况下,您应该使用单独的变量来计算总体进度,而不是使用i
来测量进度
希望这能有所帮助。作为提醒,您可以将数据发送到IntentService中的web服务器,这也是异步的。如果用户不必立即处理操作结果,则首选IntentService。这完全是背景。另一方面,您可以从它发布通知。问自己以下问题:
即使用户更改了设备方向,我也希望此操作继续吗?(如果活动被销毁,Asynctask将停止;IntentService不会停止)
相反,我是否介意操作必须重新加载(AsyncTask稍微简单一点)
我是否在存储持久数据(使用IntentService,甚至绑定服务和SyncAdapter)
用户是否需要在操作完成时留下来(如果是,异步任务完成后会提供更即时的反馈。如果不是,IntentService在某种程度上与应用程序的活动断开连接,因此它可以在其他事情发生时愉快地混行)
作为提醒,您可以将数据发送到IntentService中的web服务器,这也是异步的。如果用户不必立即处理操作结果,则首选IntentService。它完全是后台的。另一方面,您可以发布来自它的通知。问自己以下问题:
即使用户更改了设备方向,我也希望此操作继续吗?(如果活动被破坏,Asynctask将停止;IntentService不会停止)
相反,我是否介意操作必须重新加载(AsyncTask稍微简单一点)
我是否在存储持久数据(使用IntentService,甚至绑定服务和SyncAdapter)
用户是否需要在操作完成时留下来(如果是,异步任务完成后会提供更即时的反馈。如果不是,IntentService在某种程度上与应用程序的活动断开连接,因此它可以在其他事情发生时愉快地混行)
这里有很多缺少的上下文。这段代码在什么时候被调用?为什么每次都要遍历整个缓冲区?为什么在循环中反复将progressBar最大值设置为相同的值?为什么在名为progress
的变量中存储并丢弃i
?他说有很多缺少的上下文这家公司在什么时候成立