2014-03-24 31 views
2

我有一個簡單的查詢,但最近圍繞很多我一直在思考,沒有一個直接的解決方案。 我有一個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); 
     } 
+0

另一件事我雖然是將下載的JSON保存在SQLITE DB中,並在片段加載時加載它們。然後,當加載器再次下載新數據時,將該數據放入Db中並更新列表視圖。但這只是一個蹩腳的解決方法,根本無法解決問題。 – Nazgul

+0

我是否正在閱讀此權利,您正在下載70-90報價x每股票報價800kbs? – NameSpace

+0

對不起,一個錯誤。它的大約700-800字節...不是kbs更新了這個問題的問題。 – Nazgul

回答

-1

好吧,我回答我自己。

有沒有可能的方法來實現這一點。應用程序設計方法需要將列表大小限制在一個舒適的級別。就我而言,我將重點從100-150只股票的1只觀察名單轉移到每隻30只股票的多個觀察名單。因爲我不能放棄過濾和排序功能,所以這是唯一合理的方法。

此外還需要跟蹤網絡狀態更改並將執行程序調整爲單線程緩存。 wi-fi打開時全開,當移動網絡打開時顯示對話或吐司消息。

0

對於那些正在閱讀本文並且有類似問題的人,請使用分頁「在滾動結束時加載更多內容」設計,而不是將您的列表分解成多個部分。 我在Wifi或3G/4G上使用緩存線程池執行程序支持的完全限制加載,並回退到2個線程的固定線程池執行程序,並在任何其他網絡上一次加載6個程序。對我很好。

相關問題