2017-08-10 31 views
2

我有一個ListView/RecyclerView。現在,我想爲每個項目添加更多信息,並且可以根據項目值在數據庫中找到信息。你會如何實現它?充氣ListView/RecyclerView項目時查詢數據庫的最佳做法項目

最佳做法是,我應該在後臺線程中查詢數據庫嗎?如果用戶快速滾動,我應該取消查詢嗎?

+0

通常情況下,對於中小型集合,在首先填充「ListView」之前,您將加載所有數據。 – CommonsWare

回答

2

沒有「最佳實踐」據我所知,但下面是你的選擇的簡短摘要:

在UI線程當用戶滾動

它通常是一個非常不好的做法,查詢一般在UI線程上執行查詢。在ListView中這樣做是一種罪過。

也就是說,有一些ORM庫在UI線程上執行延遲加載嵌套對象(例如GreenDAO)。人們在具有ListView的應用程序中使用這些庫,甚至可以爲其中的某些應用程序正常工作。

我強烈反對這種方法。

所有項目的時間

正如@CommonsWare提到,提前查詢適用於中小企業的集合,你可以將整個數據集只加載到後臺線程內存中,然後將其綁定到ListView。數據加載時,您需要顯示某種進度指示。

「small」和「medium」的定義非常模糊,但我想說,如果您確定數據集不會大於幾個MB,那麼此方法可以很好地工作。

此方法的缺點是用戶需要等待整個數據集加載並綁定到ListView。根據數據集的大小和數據庫方案的複雜性,這可能需要一段時間。

查詢項目的預定數量開始,然後再進行額外的查詢,用戶滾動

這是所有最複雜的方案,但在某些情況下是不可避免的(如「無限列表」) 。

這個想法是將一些預定義數量的項目放入ListView中,然後跟蹤用戶的交互以提供額外的項目。

例如,您可以初始獲取100個項目,然後在用戶滾動到列表末尾時獲取額外的100個項目。

這個方案的優化是在用戶到達列表的末尾(假設他滾動了50個項目)之前獲取其他項目。這允許創建真正的「無限列表」行爲。

請注意,如果您的收藏非常大,則不僅需要在用戶滾動時添加新項目,還需要刪除「以前」項目以避免內存不足崩潰。對於項目

查詢的其他信息中已經列出

有時你想進行一些額外的查詢之後已經出現該項目。

在這種情況下,只需在後臺執行查詢並將數據綁定到該項目。

此任務的一個警告是,如果該項目的視圖被回收(默認情況下是RecyclerView),那麼當您完成背景獲取時,目標視圖可能會顯示完全不同的項目。將返回的數據綁定到此視圖將是一個錯誤。

處理此問題的一種方法是取消提取。但是,這在實踐中很麻煩並且容易出錯。

查詢啓動時,更容易的方法是設置transientState標誌,並在查詢完成時將其清除。

相關問題