我有一個簡單的查詢,但最近圍繞很多我一直在思考,沒有一個直接的解決方案。 我有一個listview加載來自互聯網的報價數據。列表項目有點複雜,但這不是問題。該列表視圖使用一個加載器加載,該加載器從互聯網獲取報價數據,解析JSON並填充VO。虛擬組織的名單在適配器設置和notifyDataSetChanged
改稱爲它通過重新加載列表中的適配器的getView
從互聯網加載數據到列表視圖的最合適的方法
現在我在這裏使用的模式是:
- 用戶點擊一個按鈕,我們打開片段
- 的片段具有
LoaderCallbacks
,我們啓動加載程序中onActivityCreated
- 它創建了一個下載加載器有一個緩存的線程池執行者(我不能使用異步裝載機,因爲他們基本上是利用線性負載在整個Android的API版本不平行)每個股票的工人。
- 工作人員點擊url並下載數據,使用GSON解析JSON,創建一個對象並將其放入加載器的數組列表中。
- 加載程序使用鎖存器等待所有報價均已下載。
- 一旦完成了列表加載。
我的問題是,當listview有很多股票,如70至90的報價下載過程變得緩慢。在直接wifi網絡上,加載列表需要大約1.5到2秒的時間。在2G,3G和Hybrid等移動數據網絡上,加載需要大約30-40秒的時間。分析顯示大部分時間都是從數據流中讀取數據。每個報價網址命中大約700-800字節,大約需要800-900ms才能加載。我正在使用HttpURLConnection
加載網址。
我不能在列表中使用動態加載模式,因爲我有菜單項來篩選和排序列表視圖。如果我們一開始並沒有列出所有報價數據,它們就不會有任何意義。
有沒有更好的方法來做到這一點?我已經閱讀了周圍的東西,並且嘗試了「當列在屏幕上可見時,列表中的每一行都有新的異步任務」,但不能使用它,因爲這意味着延遲加載數據。
編輯以顯示數據是如何反序列化:
InputStream inputstreamObj = (InputStream) conn.getContent();//getInputStream();
if(inputstreamObj != null){
Reader reader = new InputStreamReader(inputstreamObj);
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(List.class, new CompanyCorpAnnouncementsVODeserializer());
Gson gson = gsonBuilder.create();
retVal = gson.fromJson(reader, List.class);
}
另一件事我雖然是將下載的JSON保存在SQLITE DB中,並在片段加載時加載它們。然後,當加載器再次下載新數據時,將該數據放入Db中並更新列表視圖。但這只是一個蹩腳的解決方法,根本無法解決問題。 – Nazgul
我是否正在閱讀此權利,您正在下載70-90報價x每股票報價800kbs? – NameSpace
對不起,一個錯誤。它的大約700-800字節...不是kbs更新了這個問題的問題。 – Nazgul