2013-03-25 53 views
0

我在文件中有1000行,每次加載應用程序時都會向用戶提供這些行。Android字符串內容加載性能

我目前的做法是:

MainActivity:的onCreate:啓動的AsyncTask

的AsyncTask onPreExecute:進度顯示dialiog

的AsyncTask doInBackground:檢查鍵/值存在於共享首選項中,如果是,則doInBackground中不做任何事情。如果沒有(第一次用戶),從原始文件讀取並創建一個stringbuilder。將StringBuilder的內容作爲鍵值對存儲在sharedpreferences中。

AsyncTask onPostExecute:從sharedpreferences填充textview。關閉進度對話框。

的代碼從文件中doInBackground方法讀的是:

StringBuilder sb = new StringBuilder(); 
InputStream textStream = getBaseContext().getResources().openRawResource(R.raw.file); 
BufferedReader bReader = new BufferedReader(new InputStreamReader(textStream)); 

String aJsonLine = null; 
try { 
    while ((aJsonLine = bReader.readLine()) != null) { 
     sb.append(aJsonLine + System.getProperty("line.separator")); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally{ 
    try { 
     bReader.close(); 
     textStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

我看到的是,用戶必須等待約9-10秒,首次啓動和4-5秒以後啓動。任何建議,以改善我的情況下的表現。

+0

1000行速度快,不需要異步任務 – 2013-03-25 05:52:08

+0

也取決於網絡速度。如果您希望用戶與ui進行交互,則可以使用服務。你可以使用robospice。 – Raghunandan 2013-03-25 05:53:01

+0

@matheszabi,如果我不使用異步任務,UI會掛起10秒鐘。 – Sandeep 2013-03-25 05:54:47

回答

1

你不需要讓用戶等待得到加載整個列表中的值。一旦你有足夠的數據填充屏幕(10-20項,也許?),填充屏幕列表或任何與你已有的數據,這將使延遲完全不重要。

您可以查看http://developer.android.com/reference/android/content/AsyncTaskLoader.html以瞭解它應該如何完成。

+0

您的建議看起來很有前途,可以減少獲取1000行文本的開銷,然後一次性顯示1000行文本視圖。但我懷疑如何控制不同屏幕密度的線條。例如,如果我想確保1000以內,發佈時只顯示10行,我如何確保它適用於所有屏幕密度?任何想法都可以徹底解決我的問題。 – Sandeep 2013-03-25 08:57:08

+0

當你使用'AsyncTaskLoader'時,加載器會通知你的'Activity'有新的數據可用,它可能是5個項目,也許是10個,你只需要拿它們並刷新你的視圖。那麼更多的物品來了。最後屏幕已滿,可以上下滾動。所有這一切,而其餘的仍在加載,你的用戶不必看進度條,他可以立即開始在屏幕上處理項目,也許選擇一個並跳到另一個「活動」,中斷加載其餘的數據。 – lenik 2013-03-25 12:11:48

0

我寧願通過JsonReader閱讀JSON流,並提取我感興趣的名稱值對。字符串連接/垃圾收集是昂貴的操作。現在編寫代碼的方式,這些操作會減慢任務的速度。代碼中效率低下,例如在循環的每次迭代中訪問行分隔符System.getProperty("line.separator")

只需使用JSONReader即可獲得顯着的性能提升。

1

作爲一個小副業的其他意見,作爲aJsonLine是一個字符串,它是一個更好的主意,通過使用兩個附加(與新行一起存儲的值),而不是單一的一個:

sb.append(aJsonLine); 
sb.append(System.getProperty("line.separator")); 

代替:

sb.append(aJsonLine + System.getProperty("line.separator")); 

隨着以後,無論是aJsonLine和System.getProperty(「line.separator」)的結果)需要被轉換到StringBuilder的它們之間的連接前用可發生和最終值作爲參數傳遞。

當然,你也應該緩存的System.getProperty("line.separator"))

+0

謝謝。儘管我在發佈這個問題後緩存了line.separator的值,但關於使用單獨的append語句的觀點很好。 – Sandeep 2013-03-25 08:47:18