Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在AsyncTask中更新progressbar会降低上载速度_Android - Fatal编程技术网

Android 在AsyncTask中更新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+

我使用AsyncTask将图像上载到Web服务器,当我强制使用一种方法更新progressbar时,它会减慢上载速度。但是如果没有progressbar的循环更新程序,它会在几秒钟内上载图像(非常快)。下面是我用来更新progressbar的代码:

  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
    ?他说有很多缺少的上下文这家公司在什么时候成立