本發明涉及信息處理技術領域,特別是涉及一種用于列表類界面顯示的數據查詢方法、一種用于列表類界面顯示的數據查詢裝置、一種計算機設備以及一種計算機存儲介質。
背景技術:
在目前的終端應用中,會涉及到眾多的列表類界面的顯示,用以進行列表類界面顯示的數據,通常是通過數據庫查詢的方式獲得以用于列表類界面的顯示。以android系統為例,android系統使用數據庫查詢用于列表類界面的顯示的數據,一般做法是使用系統提供的數據庫接口執行一個數據庫查詢,系統接口將查詢結果填充到數據緩沖區并返回一個數據庫讀取抽象接口對象,然后android系統的應用程序將數據庫讀取抽象接口對象設置到組件,完成數據到界面的綁定,界面通過界面→組件→數據庫讀取抽象接口對象→數據緩沖區的路徑獲取到查詢好的數據。該方法雖然方便使用,但卻有諸多缺點,典型的缺陷是需要等待查詢全部完成、查詢結果全部填充到數據緩沖區后,界面才能顯示,而在此之前只能等待。數據緩沖區長度固定,若結果集非常大,則只能緩存前面一部分。當界面滑動到緩存部分以外,數據緩沖區需要在主線程重新查詢和填充,造成界面卡頓。
技術實現要素:
基于此,有必要針對列表類界面顯示時容易造成界面卡頓的問題,提供一種用于列表類界面顯示的數據查詢方法、一種用于列表類界面顯示的數據查詢裝置、一種計算機設備以及一種計算機存儲介質。
為達到上述目的,一個實施例中采用以下技術方案:
一種用于列表類界面顯示的數據查詢方法,包括步驟:
主線程在進入列表類顯示界面時,向工作線程發送查詢請求;
工作線程根據所述查詢請求進行查詢,獲取緩沖區以及初始長度數據,將獲取的初始長度數據填入所述緩沖區后,向主線程返回數據庫讀取抽象接口,并查詢所述初始長度數據之后的第一長度數據,將查詢獲得的第一長度數據填入所述緩沖區;
主線程根據數據庫讀取抽象接口從所述緩沖區讀取初始長度數據,并根據讀取的初始長度數據渲染列表;
主線程向工作線程發送數據請求,數據請求攜帶數據位置信息;工作線程接收所述數據請求,在緩沖區沒有所述數據位置信息對應的數據時,記錄所述數據位置信息,并在填入緩沖區的數據覆蓋所述數據位置信息時,向主線程發送通知消息。
一種用于列表類界面顯示的數據查詢裝置,包括:
主線程模塊,在進入列表類顯示界面時,向工作線程模塊發送查詢請求,并根據工作線程模塊返回的數據庫讀取抽象接口從緩沖區讀取初始長度數據,并根據讀取的初始長度數據渲染列表,并向工作線程模塊發送數據請求,數據請求攜帶數據位置信息;
工作線程模塊,根據所述查詢請求進行查詢,獲取緩沖區以及初始長度數據,將獲取的初始長度數據填入所述緩沖區后,向主線程模塊返回數據庫讀取抽象接口,并查詢所述初始長度數據之后的第一長度數據,將查詢獲得的第一長度數據填入所述緩沖區;并接收所述數據請求,在緩沖區沒有所述數據位置信息對應的數據時,記錄所述數據位置信息,并在填入緩沖區的數據覆蓋所述數據位置信息時,向主線程模塊發送通知消息。
一種計算機設備,包括存儲器、處理器以及存儲在所述存儲器上并可在所述處理器上運行的計算機程序,所述處理器執行所述計算機程序時實現如上所述的用于列表類界面顯示的數據查詢方法。
一種計算機存儲介質,其上存儲有計算機程序,該程序被處理器執行時實現如上所述的用于列表類界面顯示的數據查詢方法。
基于如上所述的本發明實施例的方案,結合主線程和工作線程兩個線程完成用于列表類界面顯示的數據查詢過程,查詢過程始終在工作線程進行,不占用主線程,主線程在進入列表類顯示界面時,向工作線程發送查詢請求,工作線程接收到該查詢請求后,無需等待緩沖區填滿,獲得緩沖區和較小的初始長度數據之后,先將緩沖區和較小的初始長度數據返回給主線程進行顯示,且工作線程向主線程返回初始長度數據之后,會繼續查詢初始長度數據之后的第一長度數據,從而使得主線程可以用初始長度數據進行初始界面顯示,且可以盡快從工作線程獲得新的查詢數據用以界面顯示,提高了列表類界面的顯示的響應速度和界面流暢性。
附圖說明
圖1是一個實施例的終端的組成結構的示意圖;
圖2是一個實施例的用于列表類界面顯示的數據查詢方法的流程示意圖;
圖3是一個具體示例中的主線程和工作線程之間的交互關系的示意圖;
圖4是一個具體示例中的分塊緩沖區的示意圖;
圖5是一個實施例的用于列表類界面顯示的數據查詢方法的結構示意圖。
具體實施方式
為使本發明的目的、技術方案及優點更加清楚明白,以下結合附圖及實施例,對本發明進行進一步的詳細說明。應當理解,此處所描述的具體實施方式僅僅用以解釋本發明,并不限定本發明的保護范圍。
除非另有定義,本文所使用的所有的技術和科學術語與屬于本發明的技術領域的技術人員通常理解的含義相同。本文中在本發明的說明書中所使用的術語只是為了描述具體的實施例的目的,不是旨在于限制本發明。本文所使用的術語“或/及”包括一個或多個相關的所列項目的任意的和所有的組合。
本實施例涉及的是終端對列表類界面的顯示方案,終端在一個實施例中的結構示意圖如圖1所示,該終端包括通過系統總線連接的處理器、非易失性存儲介質、通信接口、電源接口和內存。其中,終端的非易失性存儲介質存儲有操作系統和用于列表類界面顯示的數據查詢的方法對應的計算機應用程序(圖示中記為用于列表類界面顯示的數據查詢裝置),該方法對應的計算機應用程序被處理器執行時,實現一種用于列表類界面顯示的數據查詢的方法。終端的處理器用于提供計算和控制能力,支撐整個終端的運行。終端的存儲器為非易失性存儲介質中的程序的運行提供環境,該存儲器中可儲存有計算機可讀指令,該計算機可讀指令被處理器執行時,可使得處理器執行一種用于列表類界面顯示的數據查詢的方法。終端的網絡接口用于與外部設備網絡連接和通信,終端的電源接口用于與外部電源連接,外部電源通過該電源接口向終端供電。終端可以是任何一種能夠實現智能輸入輸出的設備,例如移動終端,比如手機、平板電腦等;也可以是其它具有上述結構的設備。
圖2是一個實施例中的用于列表類界面顯示的數據查詢方法的流程示意圖。如圖2所示,該實施例的方法包括:
步驟s201:主線程在進入列表類顯示界面時,向工作線程發送查詢請求;
步驟s202:工作線程根據所述查詢請求進行查詢,獲取緩沖區以及初始長度數據,將獲取的初始長度數據填入所述緩沖區后,向主線程返回數據庫讀取抽象接口,并查詢所述初始長度數據之后的第一長度數據,將查詢獲得的第一長度數據填入所述緩沖區;
步驟s203:主線程根據數據庫讀取抽象接口從所述緩沖區讀取初始長度數據,并根據讀取的初始長度數據渲染列表;
步驟s204:主線程向工作線程發送數據請求,數據請求攜帶數據位置信息;工作線程接收所述數據請求,在緩沖區沒有所述數據位置信息對應的數據時,記錄所述數據位置信息,并在填入緩沖區的數據覆蓋所述數據位置信息時,向主線程發送通知消息。
基于如上所述的本發明實施例的方案,結合主線程和工作線程兩個線程完成用于列表類界面顯示的數據查詢過程,查詢過程始終在工作線程進行,不占用主線程,主線程在進入列表類顯示界面時,向工作線程發送查詢請求,工作線程接收到該查詢請求后,無需等待緩沖區填滿,獲得緩沖區和較小的初始長度數據之后,先將緩沖區和較小的初始長度數據返回給主線程進行顯示,且工作線程向主線程返回初始長度數據之后,會繼續查詢初始長度數據之后的第一長度數據,從而使得主線程可以用初始長度數據進行初始界面顯示,且可以盡快從工作線程獲得新的查詢數據用以界面顯示,使得列表類界面的顯示不再卡頓。
在一個示例中,工作線程在將查詢獲得的第一長度數據填入所述緩沖區之后,可以進入睡眠狀態,直至接收到主線程發送的所述數據請求。
上述主線程向工作線程發送的數據請求,可以是在任何需要進一步請求數據時進行發送。
在一個示例中,主線程可以在進入的列表類顯示界面的列表可見部分的所述數據位置信息大于所述初始長度數據的位置信息時,向工作線程發送所述數據請求。從而,主線程在獲得初始長度數據進行渲染顯示之后,如果初始長度數據無法渲染全部的初始顯示界面,即可見部分的位置信息大于初始長度數據的位置信息,則向工作線程發送數據請求,以獲得更多的數據進行當前顯示界面的顯示。
另一方面,主線程也可以在滾動的過程中向工作線程發送上述數據請求,以請求新的數據進行渲染顯示。主線程可以在接收到界面滾動指令時,滾動并繪制滾動后列表界面,將滾動后列表界面的當前可見部分的最大位置信息作為所述數據位置信息,向工作線程發送所述數據請求。
其中,主線程在向工作線程發送所述數據請求后,可以在滿足調度優先級調整條件時,提高所述工作線程的調度優先級。從而,在主線程向工作線程發送數據請求后,如果工作線程已經將工作將上述數據位置信息對應的數據填充到緩沖區,則主線程可以直接從緩沖區拿到數據進行渲染。如果工作線程尚未將數據位置信息對應的數據填充到緩沖區,則主線程需要等待。此時,主線程通過提高工作線程的調度優先級,可以使得工作線程可以盡快將需要的數據填充到緩沖區,進一步減少卡頓現象。
其中,這里的調度優先級調整條件,可以結合實際需要進行設置。一個示例中,主線程可以是在向工作線程發送數據請求之后,在預定時間段內未接收到工作線程返回的通知消息時,判定滿足調度優先級調整條件。在另一個示例中,由于上述工作線程已經向主線程返回了緩沖區索引標識,因此,主線程在向工作線程發送數據請求之后,可以先嘗試從緩沖區索引標識對應的緩沖區讀取對應的數據,若未讀取到對應的數據,則判定滿足調度優先級調整條件。在其他示例中,對調度優先級調整條件,也可以做其他不同的設定。
在上述提高了工作線程的調度優先級之后,主線程還可以在接收到工作線程返回的上述通知消息時,將工作線程的調度優先級設置為默認優先級,即將工作線程的調度優先級調整回原來的調度優先級。
由于在列表類界面顯示的過程中,由于主線程可能會基于不斷的滾動過程,不斷地查詢新的數據進行顯示,而緩沖區的容量本身是有限的。因此,在一個示例中,工作線程在所述數據位置信息對應的數據量超過緩沖區容量時,可以丟棄緩沖區的前第二長度數據后,再將查詢獲得的數據填充所述緩沖區,以確保緩沖區中緩存的是最新請求的數據。
由于工作線程會將更早的數據從緩沖區清除,而在列表類界面的顯示過程中,用戶可能會向上滾動,即可能會需要重新將之前已經顯示過的數據重新渲染顯示。因此,在一個示例中,工作線程還可以在所述數據位置信息小于上一次的數據請求中的位置信息、且所述數據位置信息對應的數據不在所述緩沖區時,從初始位置遍歷數據,并在遍歷到所述數據位置信息對應的數據或者所述數據位置信息的前第三長度數據時,開始將遍歷到的數據填充到緩沖區。
主線程在離開列表界面時,向工作線程發送退出請求通知,工作線程接收退出請求通知之后關閉查詢并釋放緩沖區,從而完成列表類界面顯示的退出過程的處理。
在本示例的方案中,緩沖區可以由分塊緩沖區來實現,其中,各分塊緩沖區的大小可以相同,也可以不相同。每個分塊緩沖區均可以有起始位置和結束位置,在需要填充新的數據、增長緩沖區時,分配一個新的分塊緩沖區并將該分塊緩沖區的標識添加到上述緩沖區索引標識即可。在此情況下,在需要刪除緩沖區的數據時,可以直接刪除對應位置的分塊緩沖區即可。
以下結合其中一個具體示例進行詳細舉例說明。本實施例的方案,可以用于所有使用數據庫查詢的界面的顯示,包括滾動列表類(listview)界面、畫廊類(gallary)界面,典型列表界面包括有:微信會話列表界面、微信會話界面、微信朋友圈界面、手機電話聯系人界面、手機短信列表界面等等。
在已有的列表類界面的顯示方案中,以android系統的sdk(softwaredevelopmentkit,軟件開發工具包)自帶的實現為例,數據庫在執行完查詢過程并返回cursor(androidsdk中的用于讀取數據庫的數據庫抽象接口)后,會在匿名共享內存(ashmem)分配一個固定大小的緩沖區(cursorwindow),并往cursorwindow內填充查詢結果數據,直到緩沖區被占滿或者沒有更多的結果輸出。填充了數據的cursor返回后,可以和adapter(androidsdk中用于綁定列表類控件與cursor的組件)綁定。在滾動列表時,列表控件通過adapter->cursor->cursorwindow的路徑取得對應位置的數據,例如在列表滾動到第10行時,取出cursorwindow第10行的數據。cursorwindow長度固定,若結果集非常大,則只能緩存前面一部分。如果顯示界面滑動到緩存部分以外,cursorwindow里沒有對應位置的數據,則清空整個緩沖區并重新查詢,填充后面的數據。
然而,由于緩沖區為固定長度,而不同的查詢結果集的長度不一,在結果集較小的情況下會浪費大量內存空間。而且在首次查詢時,需要先填充滿緩沖區或者緩存完結果集的所有條目,才能用于界面顯示,填充時間長,不僅造成界面卡頓,loading等待時間也長。
為此,在本發明實施例方案中,結合主線程和工作線程兩個線程完成用于列表類界面顯示的數據查詢過程,查詢過程始終在工作線程進行,不占用主線程,而且工作線程在查詢較少的數據之后即返回給主線程進行渲染顯示,以減少初始打開界面時的界面卡頓現象,然后繼續查詢數據用以進行數據顯示。之后隨著界面的滾動,基于主線程的數據請求,工作線程會繼續遍歷查詢并填充到緩沖區,以提供后續的數據。其中,在一個示例中,工作線程可以始終持有preparedstatement(sqlite(一種廣泛用于移動終端和客戶端的輕量級文件數據庫)提供的用于讀取數據庫數據的接口),從而在遍歷更多數據時可以無需重新查詢。
基于此,結合圖3所示的主線程和工作線程之間的交互關系的示意圖,一個示例中的完整的界面顯示過程中的數據查詢過程可以是如下所述。需要說明的是,在圖3所示中,在主線程或工作線程的工作處理流程中,無灰色方框的部分表示處于等待狀態。
如圖3所示,主線程在進入列表類顯示界面時,首先向工作線程發送一個查詢請求。工作線程在接收到該查詢請求后,會做查詢準備工作,該查詢準備工作包括:編譯sql(structuredquerylanguage,結構化查詢語言)語句、申請緩沖區等,查詢初始長度數據,該初始長度數據是數據集很小的一個開頭部分,例如前16行數據。在工作線程的查詢準備的過程中,主線程必須等待,但由于本身初始長度數據的數據量較小,因此主線程等待的時間一般也較短。
工作線程在成功將開頭的初始長度數據填入緩沖區之后,向主線程返回數據庫讀取抽象接口cursor,同時可向主線程返回申請得到的緩沖區的索引標識。工作線程向主線程返回數據庫讀取抽象接口之后,不停頓,繼續往下查詢接下來部分的數據,并將查詢獲得的數據填充緩沖區,直至查詢到初始長度數據之后的第一長度數據。其中,該第一長度數據可以結合實際技術應用設定,一個示例中的第一長度數據結合上述初始長度數據可以填滿上述緩沖區,即工作線程會一直查詢直至填滿緩沖區。另一個示例中的第一長度數據可以是一個預設的臨界點,例如主線程進入的列表類顯示界面的列表可見部分以下的一定數目行數據。在查詢到初始長度數據之后的第一長度數據并填充到緩沖區之后,工作線程進入睡眠狀態,等待主線程發送新的位置請求。
主線程在接收到工作線程返回的數據庫讀取抽象接口之后,根據數據庫讀取抽象接口從緩沖區讀取初始長度數據,并用讀取到的初始長度數據渲染列表,此時,顯示界面的列表只有開頭大部分是可見的,如前16行數據。
在主線程進入的列表類顯示界面的列表可見部分的數據位置信息大于初始長度數據的位置信息時,例如列表可見部分的是24行數據,而初始長度數據是如前所述的前16行數據,則主線程向工作線程發送一個數據請求,該數據請求中攜帶上述數據位置信息,即需要的行數,隨后主線程會停下等待。
工作線程在接收到該數據請求后,記錄該數據請求中的數據位置信息,即記錄主線程需要的行數,繼續遍歷數據并填充至緩沖區,填充至緩沖區的結果集一旦覆蓋了上述數據位置信息,即覆蓋了主線程需要的行數時,則工作線程向主線程發送通知消息,喚醒主線程繼續完成渲染過程。
主線程接收到工作線程返回的通知消息后,會根據上述數據庫讀取抽象接口從緩沖區讀取對應的數據,并進行渲染。
需要說明的是,工作線程在接收到該數據請求后,若該數據請求中的數據位置信息對應的數據已經填充至緩沖區,則工作線程可以直接向主線程返回通知消息。
在列表類顯示界面的顯示過程中,用戶可能會滾動列表界面,主線程在接收到界面滾動指令之后,滾動并繪制滾動后列表界面。若滾動后需要繪制的部分可用,即緩沖區中已填充對應的數據,則可以直接從緩沖區中提取數據進行渲染繪制。如果滾動后需要繪制的部分不可用,即緩沖區未填充有對應的數據,則主線程停下來等待,將滾動后列表界面的當前可見部分的最大位置信息作為所述數據位置信息,向工作線程發送所述數據請求。在此同時,主線程還可以提高工作線程的調度優先級,使得工作線程可以盡快將需要的數據填充到緩沖區,進一步減少卡頓現象。
工作線程接收到該數據請求后,記錄該數據請求中的數據位置信息,即記錄主線程需要的行數,遍歷數據并填充至緩沖區,填充至緩沖區的結果集一旦覆蓋了上述數據位置信息,則工作線程向主線程發送通知消息,喚醒主線程繼續完成渲染過程。
一個示例中,工作線程可以僅將上述數據位置信息對應的數據填充至緩沖區。由于在界面顯示過程中,極有可能進行滾動顯示,為了避免后續滾動時可能需要等待,因此,在另一個示例中,工作線程將上述數據位置信息對應的數據填充至緩沖區之后,還可以進一步遍歷接下來的一定長度的數據存入緩沖區中,該長度可以結合實際技術需要進行設定,例如可以通過統計用戶的滾動行為設置該長度。
主線程在接收到工作線程返回的通知消息后,會根據上述數據庫讀取抽象接口從緩沖區讀取對應的數據,并進行渲染,同時可以將工作線程的調度優先級設置為默認優先級,即將工作線程的調度優先級調整回原來的調度優先級。
在一個示例中,工作線程在所述數據位置信息對應的數據量超過緩沖區容量時,可以丟棄緩沖區最前面的塊,例如緩沖區的前第二長度數據,以騰出空間,再將查詢獲得的數據填充所述緩沖區,以確保緩沖區中緩存的是最新請求的數據。
需要說明的是,圖3所示中,工作線程可能會睡眠狀態并進行等待的時間,在實際技術應用中,如果列表滾動的速度或者說主線程發送數據請求的速度大于工作線程填充數據的速度,則工作線程將會一直在追趕列表滾動而不會進入睡眠狀態。
由于工作線程會將更早的數據從緩沖區清除,而在列表類界面的顯示過程中,用戶可能會向上滾動,即可能會需要重新將之前已經顯示過的數據重新渲染顯示。在顯示列表出現往上滾動時,主線程會根據滾動到的位置向工作線程發送數據請求,該數據請求會攜帶滾動后的數據位置信息。
在此情況下,工作線程接收到的是遞減的位置請求,即當前接收到的數據請求中的數據位置信息小于上一次的數據請求中的位置信息,由于工作線程會將更早的數據從緩沖區清除,因此,工作線程會先檢查數據位置信息對應的數據是否在緩沖區內。如果仍在緩沖區內,則工作線程可以不作處理,主線程可以從緩沖區獲得對應的數據進行渲染顯示。如果數據位置信息對應的數據不在緩沖區內,即請求位置已經被丟棄,則可以從初始位置遍歷數據,并在遍歷到所述數據位置信息對應的數據或者所述數據位置信息的前第三長度數據時,開始將遍歷到的數據填充到緩沖區。其中,由于接收到了遞減的數據位置信息,因此,工作線程可以暫停往下遍歷數據的工作,提前進入休眠狀態。
上述滾動過程中請求數據的過程,可以循環重復的進行。在完成了整個的列表顯示的過程之后,在離開列表界面時,主線程向工作線程發送退出請求通知,工作線程接收退出請求通知之后關閉查詢并釋放緩沖區,從而完成列表類界面顯示的退出過程的處理。
其中,上述示例中的緩沖區,可以采用分塊緩沖區來實現,以更有益于刪除緩沖區數據和動態調整緩沖區大小,其中,每個分塊緩沖區的可以為固定大小,即具有相同的字節大小,此時,每個分塊緩沖區可以視為容量較小的cursorwindow,例如256kb。由于每一行數據的大小可能不同,所占用的空間也不一樣,因此,在各分塊緩沖區的大小相同的情況下,所能容納的行數也可能會有不同。另一方面,各分塊緩沖區的大小也可以不相同。圖4中示出了一個示例中的分塊緩沖區的示意圖,對于每個分塊緩沖區,可記錄每個分塊緩沖區的起始位置和結束位置,對于每個分塊緩沖區而言,可以用該分塊緩沖區的起始位置作為該分塊緩沖區的索引。
在此情況下,在上述示例的方案中,可以根據記錄的分塊緩沖區的起始位置和結束位置,獲取各分塊緩沖區,此時,上述緩沖區包括獲取的各分塊緩沖區,獲取得到的各分塊緩沖區的標識,可以加入到緩沖區索引標識,即緩沖區索引標識包括各分塊緩沖區的索引標識,該緩沖區索引標識可以由工作線程返回給主線程,也可以是與數據庫讀取抽象接口相綁定。
另一方面,在上述實施例的方案中,當需要更多的緩沖區時,即緩沖區需要增長時,可以分配一個新的分塊緩沖區并加入到緩沖區索引標識。在一個示例中,工作線程在基于主線程的數據請求向其返回通知消息時,如果該請求的數據是在新添加的分塊緩沖區中,則可以將該分塊緩沖區的標識返回給主線程,即可以在通知消息中攜帶分塊緩沖區的索引標識。在另一個示例中,工作線程也可以直接將該分塊緩沖區的索引標識與數據庫讀取抽象接口相綁定,從而主線程可以基于該數據庫讀取抽象接口即可從新添加的分塊緩沖區獲得數據并進行渲染。此外,當需要刪除較早的數據、騰出部分空間時,刪除對應位置的緩沖區的分塊即可。
基于分塊緩沖區的方式,在開始進行數據查詢時,可以只申請一個塊,并隨著數據遍歷過程,動態申請更多的分塊緩沖區,并將申請得到的各分塊緩沖區并在邏輯上連接起來,以達到按需分配內存的目的,使得小的結果集只占用較少的內存,而大的結果集可以有更大的可以完全緩存的可能性。而且,通過分塊緩沖區的方式,在滑動過程中列表滑動到緩沖區之外時,可以無需丟棄整個結果集,只需要丟棄時間最早的或者說存儲的數據的位置最早的一個分塊緩沖區,從而大幅提高了往回滾動時數據仍在緩沖區內的幾率,提高了列表類顯示界面的性能。
另一方面,由于數據庫是一個多用戶共享的資源,為了處理并發問題會采用數據庫鎖機制,因此,在上述實施例的數據查詢方法的執行過程中,工作線程可能會一直持有未關閉的preparedstatement,因而會一直持有數據庫的讀鎖,并占用數據庫連接池的一個連接,可能會導致其他數據庫操作無法順利進行。因此,在一個示例中,可以在工作線程持有數據庫數據讀取接口preparedstatement時,注冊一個接口到連接池或者sqlite等待回調接口,一旦出現鎖爭搶,工作線程可以基于不同的策略確定是繼續持有鎖暫時阻止其他數據庫操作,還是暫時放棄鎖允許其他數據庫操作。一個示例中的策略包括:在主線程處于等待狀態時,即主線程發送的數據請求中的數據位置信息對應的數據未在緩沖區,則繼續持有鎖;若未填充到請求位置臨界點,如已經將主線程發送的數據請求中的數據位置信息對應的數據填充到了緩沖區,但尚未將該數據位置信息之后的一定數目的數據填充到緩沖區,或者是尚未將上述第一長度數據填充到緩沖區則繼續持有鎖;若工作線程處于等待狀態或者說睡眠狀態,則暫時放棄鎖。當然,在其他實施例中,也可以做其他的策略設定。
基于本實施例中的數據查詢方案,可以優化使用數據庫查詢的列表類界面的響應速度和流暢性,優化了數據量比較大的查詢結果集的優化效果。
需要說明的是,上述示例中中是以android平臺為例進行說明,本領域技術人員可以理解的是,本實施例的方案同樣也可以適用于其他平臺的客戶端。
基于與上述方法相同的思想,圖5示出了一個實施例中的用于列表類界面顯示的數據查詢裝置的結構示意圖。如圖5所示,該實施例中的裝置包括:
主線程模塊501,在進入列表類顯示界面時,向工作線程模塊發送查詢請求,并根據工作線程模塊返回的數據庫讀取抽象接口從緩沖區讀取初始長度數據,并根據讀取的初始長度數據渲染列表,并向工作線程模塊發送數據請求,數據請求攜帶數據位置信息;
工作線程模塊502,根據所述查詢請求進行查詢,獲取緩沖區以及初始長度數據,將獲取的初始長度數據填入所述緩沖區后,向主線程模塊返回數據庫讀取抽象接口,并查詢所述初始長度數據之后的第一長度數據,將查詢獲得的第一長度數據填入所述緩沖區;并接收所述數據請求,在緩沖區沒有所述數據位置信息對應的數據時,記錄所述數據位置信息,并在填入緩沖區的數據覆蓋所述數據位置信息時,向主線程模塊發送通知消息。
可以理解,這里的主線程模塊501對應于上述主線程,工作線程模塊502對應于上述工作線程。基于本實施例的方案,結合主線程和工作線程兩個線程完成用于列表類界面顯示的數據查詢過程,查詢過程始終在工作線程進行,不占用主線程,主線程在進入列表類顯示界面時,向工作線程發送查詢請求,工作線程接收到該查詢請求后,無需等待緩沖區填滿,獲得緩沖區和較小的初始長度數據之后,先將緩沖區和較小的初始長度數據返回給主線程進行顯示,且工作線程向主線程返回初始長度數據之后,會繼續查詢初始長度數據之后的第一長度數據,從而使得主線程可以用初始長度數據進行初始界面顯示,且可以盡快從工作線程獲得新的查詢數據用以界面顯示,使得列表類界面的顯示不再卡頓。
在一個示例中,工作線程模塊502在將查詢獲得的第一長度數據填入所述緩沖區之后,可以進入睡眠狀態,直至接收到主線程模塊501發送的所述數據請求。
上述主線程模塊501向工作線程模塊502發送的數據請求,可以是在任何需要進一步請求數據時進行發送。
在一個示例中,主線程模塊501可以在進入的列表類顯示界面的列表可見部分的所述數據位置信息大于所述初始長度數據的位置信息時,向工作線程模塊502發送所述數據請求。從而,主線程模塊501在獲得初始長度數據進行渲染顯示之后,如果初始長度數據無法渲染全部的初始顯示界面,即可見部分的位置信息大于初始長度數據的位置信息,則向工作線程模塊502發送數據請求,以獲得更多的數據進行當前顯示界面的顯示。
另一方面,主線程模塊501也可以在滾動的過程中向工作線程模塊502發送上述數據請求,以請求新的數據進行渲染顯示。此時主線程模塊501,在接收到界面滾動指令時,滾動并繪制滾動后列表界面,將滾動后列表界面的當前可見部分的最大位置信息作為所述數據位置信息,向工作線程模塊502發送所述數據請求。
其中,主線程模塊501在向工作線程模塊502發送所述數據請求后,可以在滿足調度優先級調整條件時,提高工作線程模塊502的調度優先級。從而,在主線程模塊501向工作線程模塊502發送數據請求后,如果工作線程模塊502已經將工作將上述數據位置信息對應的數據填充到緩沖區,則主線程模塊501可以直接從緩沖區拿到數據進行渲染。如果工作線程模塊502尚未將數據位置信息對應的數據填充到緩沖區,則主線程模塊501需要等待。此時,主線程模塊501通過提高工作線程模塊502的調度優先級,可以使得工作線程模塊502可以盡快將需要的數據填充到緩沖區,進一步減少卡頓現象。
其中,這里的調度優先級調整條件,可以結合實際需要進行設置。一個示例中,主線程模塊501可以是在向工作線程模塊502發送數據請求之后,在預定時間段內未接收到工作線程模塊502返回的通知消息時,判定滿足調度優先級調整條件。在另一個示例中,由于上述工作線程模塊502已經向主線程模塊501返回了緩沖區索引標識,因此,主線程模塊501在向工作線程模塊502發送數據請求之后,可以先嘗試從緩沖區索引標識對應的緩沖區讀取對應的數據,若未讀取到對應的數據,則判定滿足調度優先級調整條件。在其他示例中,對調度優先級調整條件,也可以做其他不同的設定。
在上述提高了工作線程的調度優先級之后,主線程模塊501還可以在接收到工作線程模塊502返回的上述通知消息時,將工作線程模塊502的調度優先級設置為默認優先級,即將工作線程模塊502的調度優先級調整回原來的調度優先級。
由于在列表類界面顯示的過程中,由于主線程模塊501可能會基于不斷的滾動過程,不斷地查詢新的數據進行顯示,而緩沖區的容量本身是有限的。因此,在一個示例中,工作線程模塊502在所述數據位置信息對應的數據量超過緩沖區容量時,可以丟棄緩沖區的前第二長度數據后,再將查詢獲得的數據填充所述緩沖區,以確保緩沖區中緩存的是最新請求的數據。
主線程模塊501在離開列表界面時,向工作線程模塊502發送退出請求通知,工作線程模塊502接收退出請求通知之后關閉查詢并釋放緩沖區,從而完成列表類界面顯示的退出過程的處理。
在本示例的方案中,緩沖區可以由分塊緩沖區來實現,其中,各分塊緩沖區的大小可以相同,也可以不相同。每個分塊緩沖區均可以有起始位置和結束位置,在需要填充新的數據、增長緩沖區時,分配一個新的分塊緩沖區并將該分塊緩沖區的標識添加到上述緩沖區索引標識即可。從而工作線程模塊502,可以根據記錄的分塊緩沖區的起始位置和結束位置,獲取各分塊緩沖區,所述緩沖區包括獲取的各分塊緩沖區,各分塊緩沖區的大小相同或不同。在此情況下,在需要刪除緩沖區的數據時,可以直接刪除對應位置的分塊緩沖區即可。
基于如上所述的示例,在一個實施例中還提供一種計算機設備,該計算機設備包括存儲器、處理器及存儲在存儲器上并可在處理器上運行的計算機程序,其中,處理器執行所述程序時實現如上述各實施例中的任意一種用于列表類界面顯示的數據查詢方法。
本領域普通技術人員可以理解實現上述實施例方法中的全部或部分流程,是可以通過計算機程序來指令相關的硬件來完成,所述的程序可存儲于一非易失性的計算機可讀取存儲介質中,如本發明實施例中,該程序可存儲于計算機系統的存儲介質中,并被該計算機系統中的至少一個處理器執行,以實現包括如上述各方法的實施例的流程。其中,所述的存儲介質可為磁碟、光盤、只讀存儲記憶體(read-onlymemory,rom)或隨機存儲記憶體(randomaccessmemory,ram)等。
據此,在一個實施例中還提供一種存儲介質,其上存儲有計算機程序,其中,該程序被處理器執行時實現如上述各實施例中的任意一種用于列表類界面顯示的數據查詢方法。
以上所述實施例的各技術特征可以進行任意的組合,為使描述簡潔,未對上述實施例中的各個技術特征所有可能的組合都進行描述,然而,只要這些技術特征的組合不存在矛盾,都應當認為是本說明書記載的范圍。
以上所述實施例僅表達了本發明的幾種實施方式,其描述較為具體和詳細,但并不能因此而理解為對發明專利范圍的限制。應當指出的是,對于本領域的普通技術人員來說,在不脫離本發明構思的前提下,還可以做出若干變形和改進,這些都屬于本發明的保護范圍。因此,本發明專利的保護范圍應以所附權利要求為準。