2015-12-05 37 views
0

我是Android開發的新手,我試圖製作一個應用程序,只需將給定網頁的源代碼下載爲一個字符串並將其顯示在日誌中。我有它的工作,併爲google.com,它的工作相當快。然而,對於我想要的網頁,即使我的電腦的網絡瀏覽器只能在幾秒鐘內加載它,它仍需要八分鐘。在這八分鐘內,四條消息在日誌中一遍又一遍地顯示,並且具有不同的值。它們是:Android應用程序需要永久下載網頁內容作爲字符串(WaitForGcToComplete爲xx.xxxms阻塞原因HeapTrim?)

  • W /藝術:暫停所有線程了:x.xxxm
  • I /藝術:背景stcky併發標記掃描GC釋放XX(xxxxB)AllocSpace對象...
  • I /藝術:背景部分併發標記掃描GC釋放XX(xxxxB)AllocSpace對象...
  • I /藝術:WaitForGcToComplete阻塞xx.xxxms的原因HeapTrip

有人能請解釋一下是怎麼回事,我怎麼可以獲取此內容下載標誌速度更快?這是一種記憶問題嗎?我需要使用某種BufferedReader嗎?

日誌消息:
Click here for a log screenshot messages.

代碼:
Click here for my code.

回答

2

終於想通這一個。問題是String是一個不可變的類,這意味着垃圾收集器需要清除從Java的堆內存中讀取下載的內容時創建的每個字符串,該字符串是永久存在的。

修復方法是在doInBackground方法的第一行中創建一個新的StringBuilder(),在整個方法中使用該StringBuilder代替String,然後在最後將StringBuilder轉換爲String(StringBuilder。的toString())。

+0

此外,而不是閱讀字符逐一使用重載的方法來讀取字符數組。這將嚴重降低方法調用開銷。 – nekavally