2013-09-26 125 views
2

我使用AsyncTask將圖片上傳到網絡服務器,當我推動更新進度條的方法時,它會減慢上傳速度。但是,如果沒有進度條的循環更新程序,它會上傳圖像在幾秒鐘內(非常快)。下面是我用它來更新進度代碼:
在AsyncTask中更新進度條會減慢上傳速度

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

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

反正我有可以更新的進度不會導致操作變慢?

+1

這裏有很多遺漏的上下文,該代碼在什麼時候調用?爲什麼要迭代每次都有一個完整的緩衝區?爲什麼在循環中一次又一次地將progressBar設置爲相同的值?爲什麼要在一個名爲'progress'的變量中存儲並丟棄'i'? –

回答

2

幾個想法:

  1. 你並不需要設置progressBar1最大的循環的每個迭代,這是因爲bufferSize毫無意義的循環內不會改變。在循環外部移動該命令。
  2. 嘗試記住您以前的進度: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)等

另外,我覺得有imFileLen之間沒有真正的關係......什麼你的bufferSize?它是否小於mFileLen(應該是)。在這種情況下,您應該使用單獨的變量來計算它使用的整體進度,而不是i來衡量進度。

希望這會有所幫助。

+0

關於第一點,我承認這是一個愚蠢的舉動,它可能會在更新UI時減慢上傳速度。所以我把它移到循環之外,但它似乎是同一個問題。關於第二點,我會看看。非常感謝... – Alamri

+0

當你說「嘗試記住」我沒有真正得到那個!你能不能請更多的exaplin。因爲將'prev'和'curr'放在同一個循環中看起來不起作用,並且它根本不更新進度條。 – Alamri

+0

編輯回答一個例子 –

2

作爲提醒,您可以將數據發送到IntentService中的Web服務器,該服務器也是異步的。如果用戶沒有立即執行操作的結果,則首選IntentService。完全背景。另一方面,您可以發佈通知。問自己這些問題:

  1. 即使用戶更改設備方向,我是否還希望繼續此操作? (如果Activity被銷燬,Asynctask將停止; IntentService不會)。
  2. 相反,我介意操作是否需要重新加載(AsyncTask有點簡單)。
  3. 我是否存儲持久性數據(使用一個IntentService甚至綁定服務和SyncAdapter)
  4. 是否用戶需要同時操作完成,要堅持(好像是,一個的AsyncTask提供了更多的即時反饋,當其完成。如果不,IntentService與應用程序的Activities有些分離,所以它可以在發生其他事情時愉快地轉過身來。
+0

上傳完成後,我必須將一些數據推送到主UI,IntentService是否可以這樣做?如果是的話......它是否也能夠在上傳過程中更新主UI?關於我已經測試的方向,但對於一些它如何不不會影響AsyncTask ......不知道在完成構圖之前上傳速度如此之快......從我的觀點來看,我認爲這裏選擇的是AsyncTask ..因爲在上傳之前我解碼$編碼圖像,所以它的尺寸更小...所以上傳非常快速,而用戶在不離開它的情況下注視活動。 – Alamri