最新的毛片基地免费,国产国语一级毛片,免费国产成人高清在线电影,中天堂国产日韩欧美,中国国产aa一级毛片,国产va欧美va在线观看,成人不卡在线

用于界面顯示的數(shù)據(jù)查詢方法、裝置、計算機設備及存儲介質與流程

文檔序號:11251020閱讀:2567來源:國知局
用于界面顯示的數(shù)據(jù)查詢方法、裝置、計算機設備及存儲介質與流程

本發(fā)明涉及信息處理技術領域,特別是涉及一種用于列表類界面顯示的數(shù)據(jù)查詢方法、一種用于列表類界面顯示的數(shù)據(jù)查詢裝置、一種計算機設備以及一種計算機存儲介質。



背景技術:

在目前的終端應用中,會涉及到眾多的列表類界面的顯示,用以進行列表類界面顯示的數(shù)據(jù),通常是通過數(shù)據(jù)庫查詢的方式獲得以用于列表類界面的顯示。以android系統(tǒng)為例,android系統(tǒng)使用數(shù)據(jù)庫查詢用于列表類界面的顯示的數(shù)據(jù),一般做法是使用系統(tǒng)提供的數(shù)據(jù)庫接口執(zhí)行一個數(shù)據(jù)庫查詢,系統(tǒng)接口將查詢結果填充到數(shù)據(jù)緩沖區(qū)并返回一個數(shù)據(jù)庫讀取抽象接口對象,然后android系統(tǒng)的應用程序將數(shù)據(jù)庫讀取抽象接口對象設置到組件,完成數(shù)據(jù)到界面的綁定,界面通過界面→組件→數(shù)據(jù)庫讀取抽象接口對象→數(shù)據(jù)緩沖區(qū)的路徑獲取到查詢好的數(shù)據(jù)。該方法雖然方便使用,但卻有諸多缺點,典型的缺陷是需要等待查詢?nèi)客瓿伞⒉樵兘Y果全部填充到數(shù)據(jù)緩沖區(qū)后,界面才能顯示,而在此之前只能等待。數(shù)據(jù)緩沖區(qū)長度固定,若結果集非常大,則只能緩存前面一部分。當界面滑動到緩存部分以外,數(shù)據(jù)緩沖區(qū)需要在主線程重新查詢和填充,造成界面卡頓。



技術實現(xiàn)要素:

基于此,有必要針對列表類界面顯示時容易造成界面卡頓的問題,提供一種用于列表類界面顯示的數(shù)據(jù)查詢方法、一種用于列表類界面顯示的數(shù)據(jù)查詢裝置、一種計算機設備以及一種計算機存儲介質。

為達到上述目的,一個實施例中采用以下技術方案:

一種用于列表類界面顯示的數(shù)據(jù)查詢方法,包括步驟:

主線程在進入列表類顯示界面時,向工作線程發(fā)送查詢請求;

工作線程根據(jù)所述查詢請求進行查詢,獲取緩沖區(qū)以及初始長度數(shù)據(jù),將獲取的初始長度數(shù)據(jù)填入所述緩沖區(qū)后,向主線程返回數(shù)據(jù)庫讀取抽象接口,并查詢所述初始長度數(shù)據(jù)之后的第一長度數(shù)據(jù),將查詢獲得的第一長度數(shù)據(jù)填入所述緩沖區(qū);

主線程根據(jù)數(shù)據(jù)庫讀取抽象接口從所述緩沖區(qū)讀取初始長度數(shù)據(jù),并根據(jù)讀取的初始長度數(shù)據(jù)渲染列表;

主線程向工作線程發(fā)送數(shù)據(jù)請求,數(shù)據(jù)請求攜帶數(shù)據(jù)位置信息;工作線程接收所述數(shù)據(jù)請求,在緩沖區(qū)沒有所述數(shù)據(jù)位置信息對應的數(shù)據(jù)時,記錄所述數(shù)據(jù)位置信息,并在填入緩沖區(qū)的數(shù)據(jù)覆蓋所述數(shù)據(jù)位置信息時,向主線程發(fā)送通知消息。

一種用于列表類界面顯示的數(shù)據(jù)查詢裝置,包括:

主線程模塊,在進入列表類顯示界面時,向工作線程模塊發(fā)送查詢請求,并根據(jù)工作線程模塊返回的數(shù)據(jù)庫讀取抽象接口從緩沖區(qū)讀取初始長度數(shù)據(jù),并根據(jù)讀取的初始長度數(shù)據(jù)渲染列表,并向工作線程模塊發(fā)送數(shù)據(jù)請求,數(shù)據(jù)請求攜帶數(shù)據(jù)位置信息;

工作線程模塊,根據(jù)所述查詢請求進行查詢,獲取緩沖區(qū)以及初始長度數(shù)據(jù),將獲取的初始長度數(shù)據(jù)填入所述緩沖區(qū)后,向主線程模塊返回數(shù)據(jù)庫讀取抽象接口,并查詢所述初始長度數(shù)據(jù)之后的第一長度數(shù)據(jù),將查詢獲得的第一長度數(shù)據(jù)填入所述緩沖區(qū);并接收所述數(shù)據(jù)請求,在緩沖區(qū)沒有所述數(shù)據(jù)位置信息對應的數(shù)據(jù)時,記錄所述數(shù)據(jù)位置信息,并在填入緩沖區(qū)的數(shù)據(jù)覆蓋所述數(shù)據(jù)位置信息時,向主線程模塊發(fā)送通知消息。

一種計算機設備,包括存儲器、處理器以及存儲在所述存儲器上并可在所述處理器上運行的計算機程序,所述處理器執(zhí)行所述計算機程序時實現(xiàn)如上所述的用于列表類界面顯示的數(shù)據(jù)查詢方法。

一種計算機存儲介質,其上存儲有計算機程序,該程序被處理器執(zhí)行時實現(xiàn)如上所述的用于列表類界面顯示的數(shù)據(jù)查詢方法。

基于如上所述的本發(fā)明實施例的方案,結合主線程和工作線程兩個線程完成用于列表類界面顯示的數(shù)據(jù)查詢過程,查詢過程始終在工作線程進行,不占用主線程,主線程在進入列表類顯示界面時,向工作線程發(fā)送查詢請求,工作線程接收到該查詢請求后,無需等待緩沖區(qū)填滿,獲得緩沖區(qū)和較小的初始長度數(shù)據(jù)之后,先將緩沖區(qū)和較小的初始長度數(shù)據(jù)返回給主線程進行顯示,且工作線程向主線程返回初始長度數(shù)據(jù)之后,會繼續(xù)查詢初始長度數(shù)據(jù)之后的第一長度數(shù)據(jù),從而使得主線程可以用初始長度數(shù)據(jù)進行初始界面顯示,且可以盡快從工作線程獲得新的查詢數(shù)據(jù)用以界面顯示,提高了列表類界面的顯示的響應速度和界面流暢性。

附圖說明

圖1是一個實施例的終端的組成結構的示意圖;

圖2是一個實施例的用于列表類界面顯示的數(shù)據(jù)查詢方法的流程示意圖;

圖3是一個具體示例中的主線程和工作線程之間的交互關系的示意圖;

圖4是一個具體示例中的分塊緩沖區(qū)的示意圖;

圖5是一個實施例的用于列表類界面顯示的數(shù)據(jù)查詢方法的結構示意圖。

具體實施方式

為使本發(fā)明的目的、技術方案及優(yōu)點更加清楚明白,以下結合附圖及實施例,對本發(fā)明進行進一步的詳細說明。應當理解,此處所描述的具體實施方式僅僅用以解釋本發(fā)明,并不限定本發(fā)明的保護范圍。

除非另有定義,本文所使用的所有的技術和科學術語與屬于本發(fā)明的技術領域的技術人員通常理解的含義相同。本文中在本發(fā)明的說明書中所使用的術語只是為了描述具體的實施例的目的,不是旨在于限制本發(fā)明。本文所使用的術語“或/及”包括一個或多個相關的所列項目的任意的和所有的組合。

本實施例涉及的是終端對列表類界面的顯示方案,終端在一個實施例中的結構示意圖如圖1所示,該終端包括通過系統(tǒng)總線連接的處理器、非易失性存儲介質、通信接口、電源接口和內(nèi)存。其中,終端的非易失性存儲介質存儲有操作系統(tǒng)和用于列表類界面顯示的數(shù)據(jù)查詢的方法對應的計算機應用程序(圖示中記為用于列表類界面顯示的數(shù)據(jù)查詢裝置),該方法對應的計算機應用程序被處理器執(zhí)行時,實現(xiàn)一種用于列表類界面顯示的數(shù)據(jù)查詢的方法。終端的處理器用于提供計算和控制能力,支撐整個終端的運行。終端的存儲器為非易失性存儲介質中的程序的運行提供環(huán)境,該存儲器中可儲存有計算機可讀指令,該計算機可讀指令被處理器執(zhí)行時,可使得處理器執(zhí)行一種用于列表類界面顯示的數(shù)據(jù)查詢的方法。終端的網(wǎng)絡接口用于與外部設備網(wǎng)絡連接和通信,終端的電源接口用于與外部電源連接,外部電源通過該電源接口向終端供電。終端可以是任何一種能夠實現(xiàn)智能輸入輸出的設備,例如移動終端,比如手機、平板電腦等;也可以是其它具有上述結構的設備。

圖2是一個實施例中的用于列表類界面顯示的數(shù)據(jù)查詢方法的流程示意圖。如圖2所示,該實施例的方法包括:

步驟s201:主線程在進入列表類顯示界面時,向工作線程發(fā)送查詢請求;

步驟s202:工作線程根據(jù)所述查詢請求進行查詢,獲取緩沖區(qū)以及初始長度數(shù)據(jù),將獲取的初始長度數(shù)據(jù)填入所述緩沖區(qū)后,向主線程返回數(shù)據(jù)庫讀取抽象接口,并查詢所述初始長度數(shù)據(jù)之后的第一長度數(shù)據(jù),將查詢獲得的第一長度數(shù)據(jù)填入所述緩沖區(qū);

步驟s203:主線程根據(jù)數(shù)據(jù)庫讀取抽象接口從所述緩沖區(qū)讀取初始長度數(shù)據(jù),并根據(jù)讀取的初始長度數(shù)據(jù)渲染列表;

步驟s204:主線程向工作線程發(fā)送數(shù)據(jù)請求,數(shù)據(jù)請求攜帶數(shù)據(jù)位置信息;工作線程接收所述數(shù)據(jù)請求,在緩沖區(qū)沒有所述數(shù)據(jù)位置信息對應的數(shù)據(jù)時,記錄所述數(shù)據(jù)位置信息,并在填入緩沖區(qū)的數(shù)據(jù)覆蓋所述數(shù)據(jù)位置信息時,向主線程發(fā)送通知消息。

基于如上所述的本發(fā)明實施例的方案,結合主線程和工作線程兩個線程完成用于列表類界面顯示的數(shù)據(jù)查詢過程,查詢過程始終在工作線程進行,不占用主線程,主線程在進入列表類顯示界面時,向工作線程發(fā)送查詢請求,工作線程接收到該查詢請求后,無需等待緩沖區(qū)填滿,獲得緩沖區(qū)和較小的初始長度數(shù)據(jù)之后,先將緩沖區(qū)和較小的初始長度數(shù)據(jù)返回給主線程進行顯示,且工作線程向主線程返回初始長度數(shù)據(jù)之后,會繼續(xù)查詢初始長度數(shù)據(jù)之后的第一長度數(shù)據(jù),從而使得主線程可以用初始長度數(shù)據(jù)進行初始界面顯示,且可以盡快從工作線程獲得新的查詢數(shù)據(jù)用以界面顯示,使得列表類界面的顯示不再卡頓。

在一個示例中,工作線程在將查詢獲得的第一長度數(shù)據(jù)填入所述緩沖區(qū)之后,可以進入睡眠狀態(tài),直至接收到主線程發(fā)送的所述數(shù)據(jù)請求。

上述主線程向工作線程發(fā)送的數(shù)據(jù)請求,可以是在任何需要進一步請求數(shù)據(jù)時進行發(fā)送。

在一個示例中,主線程可以在進入的列表類顯示界面的列表可見部分的所述數(shù)據(jù)位置信息大于所述初始長度數(shù)據(jù)的位置信息時,向工作線程發(fā)送所述數(shù)據(jù)請求。從而,主線程在獲得初始長度數(shù)據(jù)進行渲染顯示之后,如果初始長度數(shù)據(jù)無法渲染全部的初始顯示界面,即可見部分的位置信息大于初始長度數(shù)據(jù)的位置信息,則向工作線程發(fā)送數(shù)據(jù)請求,以獲得更多的數(shù)據(jù)進行當前顯示界面的顯示。

另一方面,主線程也可以在滾動的過程中向工作線程發(fā)送上述數(shù)據(jù)請求,以請求新的數(shù)據(jù)進行渲染顯示。主線程可以在接收到界面滾動指令時,滾動并繪制滾動后列表界面,將滾動后列表界面的當前可見部分的最大位置信息作為所述數(shù)據(jù)位置信息,向工作線程發(fā)送所述數(shù)據(jù)請求。

其中,主線程在向工作線程發(fā)送所述數(shù)據(jù)請求后,可以在滿足調度優(yōu)先級調整條件時,提高所述工作線程的調度優(yōu)先級。從而,在主線程向工作線程發(fā)送數(shù)據(jù)請求后,如果工作線程已經(jīng)將工作將上述數(shù)據(jù)位置信息對應的數(shù)據(jù)填充到緩沖區(qū),則主線程可以直接從緩沖區(qū)拿到數(shù)據(jù)進行渲染。如果工作線程尚未將數(shù)據(jù)位置信息對應的數(shù)據(jù)填充到緩沖區(qū),則主線程需要等待。此時,主線程通過提高工作線程的調度優(yōu)先級,可以使得工作線程可以盡快將需要的數(shù)據(jù)填充到緩沖區(qū),進一步減少卡頓現(xiàn)象。

其中,這里的調度優(yōu)先級調整條件,可以結合實際需要進行設置。一個示例中,主線程可以是在向工作線程發(fā)送數(shù)據(jù)請求之后,在預定時間段內(nèi)未接收到工作線程返回的通知消息時,判定滿足調度優(yōu)先級調整條件。在另一個示例中,由于上述工作線程已經(jīng)向主線程返回了緩沖區(qū)索引標識,因此,主線程在向工作線程發(fā)送數(shù)據(jù)請求之后,可以先嘗試從緩沖區(qū)索引標識對應的緩沖區(qū)讀取對應的數(shù)據(jù),若未讀取到對應的數(shù)據(jù),則判定滿足調度優(yōu)先級調整條件。在其他示例中,對調度優(yōu)先級調整條件,也可以做其他不同的設定。

在上述提高了工作線程的調度優(yōu)先級之后,主線程還可以在接收到工作線程返回的上述通知消息時,將工作線程的調度優(yōu)先級設置為默認優(yōu)先級,即將工作線程的調度優(yōu)先級調整回原來的調度優(yōu)先級。

由于在列表類界面顯示的過程中,由于主線程可能會基于不斷的滾動過程,不斷地查詢新的數(shù)據(jù)進行顯示,而緩沖區(qū)的容量本身是有限的。因此,在一個示例中,工作線程在所述數(shù)據(jù)位置信息對應的數(shù)據(jù)量超過緩沖區(qū)容量時,可以丟棄緩沖區(qū)的前第二長度數(shù)據(jù)后,再將查詢獲得的數(shù)據(jù)填充所述緩沖區(qū),以確保緩沖區(qū)中緩存的是最新請求的數(shù)據(jù)。

由于工作線程會將更早的數(shù)據(jù)從緩沖區(qū)清除,而在列表類界面的顯示過程中,用戶可能會向上滾動,即可能會需要重新將之前已經(jīng)顯示過的數(shù)據(jù)重新渲染顯示。因此,在一個示例中,工作線程還可以在所述數(shù)據(jù)位置信息小于上一次的數(shù)據(jù)請求中的位置信息、且所述數(shù)據(jù)位置信息對應的數(shù)據(jù)不在所述緩沖區(qū)時,從初始位置遍歷數(shù)據(jù),并在遍歷到所述數(shù)據(jù)位置信息對應的數(shù)據(jù)或者所述數(shù)據(jù)位置信息的前第三長度數(shù)據(jù)時,開始將遍歷到的數(shù)據(jù)填充到緩沖區(qū)。

主線程在離開列表界面時,向工作線程發(fā)送退出請求通知,工作線程接收退出請求通知之后關閉查詢并釋放緩沖區(qū),從而完成列表類界面顯示的退出過程的處理。

在本示例的方案中,緩沖區(qū)可以由分塊緩沖區(qū)來實現(xiàn),其中,各分塊緩沖區(qū)的大小可以相同,也可以不相同。每個分塊緩沖區(qū)均可以有起始位置和結束位置,在需要填充新的數(shù)據(jù)、增長緩沖區(qū)時,分配一個新的分塊緩沖區(qū)并將該分塊緩沖區(qū)的標識添加到上述緩沖區(qū)索引標識即可。在此情況下,在需要刪除緩沖區(qū)的數(shù)據(jù)時,可以直接刪除對應位置的分塊緩沖區(qū)即可。

以下結合其中一個具體示例進行詳細舉例說明。本實施例的方案,可以用于所有使用數(shù)據(jù)庫查詢的界面的顯示,包括滾動列表類(listview)界面、畫廊類(gallary)界面,典型列表界面包括有:微信會話列表界面、微信會話界面、微信朋友圈界面、手機電話聯(lián)系人界面、手機短信列表界面等等。

在已有的列表類界面的顯示方案中,以android系統(tǒng)的sdk(softwaredevelopmentkit,軟件開發(fā)工具包)自帶的實現(xiàn)為例,數(shù)據(jù)庫在執(zhí)行完查詢過程并返回cursor(androidsdk中的用于讀取數(shù)據(jù)庫的數(shù)據(jù)庫抽象接口)后,會在匿名共享內(nèi)存(ashmem)分配一個固定大小的緩沖區(qū)(cursorwindow),并往cursorwindow內(nèi)填充查詢結果數(shù)據(jù),直到緩沖區(qū)被占滿或者沒有更多的結果輸出。填充了數(shù)據(jù)的cursor返回后,可以和adapter(androidsdk中用于綁定列表類控件與cursor的組件)綁定。在滾動列表時,列表控件通過adapter->cursor->cursorwindow的路徑取得對應位置的數(shù)據(jù),例如在列表滾動到第10行時,取出cursorwindow第10行的數(shù)據(jù)。cursorwindow長度固定,若結果集非常大,則只能緩存前面一部分。如果顯示界面滑動到緩存部分以外,cursorwindow里沒有對應位置的數(shù)據(jù),則清空整個緩沖區(qū)并重新查詢,填充后面的數(shù)據(jù)。

然而,由于緩沖區(qū)為固定長度,而不同的查詢結果集的長度不一,在結果集較小的情況下會浪費大量內(nèi)存空間。而且在首次查詢時,需要先填充滿緩沖區(qū)或者緩存完結果集的所有條目,才能用于界面顯示,填充時間長,不僅造成界面卡頓,loading等待時間也長。

為此,在本發(fā)明實施例方案中,結合主線程和工作線程兩個線程完成用于列表類界面顯示的數(shù)據(jù)查詢過程,查詢過程始終在工作線程進行,不占用主線程,而且工作線程在查詢較少的數(shù)據(jù)之后即返回給主線程進行渲染顯示,以減少初始打開界面時的界面卡頓現(xiàn)象,然后繼續(xù)查詢數(shù)據(jù)用以進行數(shù)據(jù)顯示。之后隨著界面的滾動,基于主線程的數(shù)據(jù)請求,工作線程會繼續(xù)遍歷查詢并填充到緩沖區(qū),以提供后續(xù)的數(shù)據(jù)。其中,在一個示例中,工作線程可以始終持有preparedstatement(sqlite(一種廣泛用于移動終端和客戶端的輕量級文件數(shù)據(jù)庫)提供的用于讀取數(shù)據(jù)庫數(shù)據(jù)的接口),從而在遍歷更多數(shù)據(jù)時可以無需重新查詢。

基于此,結合圖3所示的主線程和工作線程之間的交互關系的示意圖,一個示例中的完整的界面顯示過程中的數(shù)據(jù)查詢過程可以是如下所述。需要說明的是,在圖3所示中,在主線程或工作線程的工作處理流程中,無灰色方框的部分表示處于等待狀態(tài)。

如圖3所示,主線程在進入列表類顯示界面時,首先向工作線程發(fā)送一個查詢請求。工作線程在接收到該查詢請求后,會做查詢準備工作,該查詢準備工作包括:編譯sql(structuredquerylanguage,結構化查詢語言)語句、申請緩沖區(qū)等,查詢初始長度數(shù)據(jù),該初始長度數(shù)據(jù)是數(shù)據(jù)集很小的一個開頭部分,例如前16行數(shù)據(jù)。在工作線程的查詢準備的過程中,主線程必須等待,但由于本身初始長度數(shù)據(jù)的數(shù)據(jù)量較小,因此主線程等待的時間一般也較短。

工作線程在成功將開頭的初始長度數(shù)據(jù)填入緩沖區(qū)之后,向主線程返回數(shù)據(jù)庫讀取抽象接口cursor,同時可向主線程返回申請得到的緩沖區(qū)的索引標識。工作線程向主線程返回數(shù)據(jù)庫讀取抽象接口之后,不停頓,繼續(xù)往下查詢接下來部分的數(shù)據(jù),并將查詢獲得的數(shù)據(jù)填充緩沖區(qū),直至查詢到初始長度數(shù)據(jù)之后的第一長度數(shù)據(jù)。其中,該第一長度數(shù)據(jù)可以結合實際技術應用設定,一個示例中的第一長度數(shù)據(jù)結合上述初始長度數(shù)據(jù)可以填滿上述緩沖區(qū),即工作線程會一直查詢直至填滿緩沖區(qū)。另一個示例中的第一長度數(shù)據(jù)可以是一個預設的臨界點,例如主線程進入的列表類顯示界面的列表可見部分以下的一定數(shù)目行數(shù)據(jù)。在查詢到初始長度數(shù)據(jù)之后的第一長度數(shù)據(jù)并填充到緩沖區(qū)之后,工作線程進入睡眠狀態(tài),等待主線程發(fā)送新的位置請求。

主線程在接收到工作線程返回的數(shù)據(jù)庫讀取抽象接口之后,根據(jù)數(shù)據(jù)庫讀取抽象接口從緩沖區(qū)讀取初始長度數(shù)據(jù),并用讀取到的初始長度數(shù)據(jù)渲染列表,此時,顯示界面的列表只有開頭大部分是可見的,如前16行數(shù)據(jù)。

在主線程進入的列表類顯示界面的列表可見部分的數(shù)據(jù)位置信息大于初始長度數(shù)據(jù)的位置信息時,例如列表可見部分的是24行數(shù)據(jù),而初始長度數(shù)據(jù)是如前所述的前16行數(shù)據(jù),則主線程向工作線程發(fā)送一個數(shù)據(jù)請求,該數(shù)據(jù)請求中攜帶上述數(shù)據(jù)位置信息,即需要的行數(shù),隨后主線程會停下等待。

工作線程在接收到該數(shù)據(jù)請求后,記錄該數(shù)據(jù)請求中的數(shù)據(jù)位置信息,即記錄主線程需要的行數(shù),繼續(xù)遍歷數(shù)據(jù)并填充至緩沖區(qū),填充至緩沖區(qū)的結果集一旦覆蓋了上述數(shù)據(jù)位置信息,即覆蓋了主線程需要的行數(shù)時,則工作線程向主線程發(fā)送通知消息,喚醒主線程繼續(xù)完成渲染過程。

主線程接收到工作線程返回的通知消息后,會根據(jù)上述數(shù)據(jù)庫讀取抽象接口從緩沖區(qū)讀取對應的數(shù)據(jù),并進行渲染。

需要說明的是,工作線程在接收到該數(shù)據(jù)請求后,若該數(shù)據(jù)請求中的數(shù)據(jù)位置信息對應的數(shù)據(jù)已經(jīng)填充至緩沖區(qū),則工作線程可以直接向主線程返回通知消息。

在列表類顯示界面的顯示過程中,用戶可能會滾動列表界面,主線程在接收到界面滾動指令之后,滾動并繪制滾動后列表界面。若滾動后需要繪制的部分可用,即緩沖區(qū)中已填充對應的數(shù)據(jù),則可以直接從緩沖區(qū)中提取數(shù)據(jù)進行渲染繪制。如果滾動后需要繪制的部分不可用,即緩沖區(qū)未填充有對應的數(shù)據(jù),則主線程停下來等待,將滾動后列表界面的當前可見部分的最大位置信息作為所述數(shù)據(jù)位置信息,向工作線程發(fā)送所述數(shù)據(jù)請求。在此同時,主線程還可以提高工作線程的調度優(yōu)先級,使得工作線程可以盡快將需要的數(shù)據(jù)填充到緩沖區(qū),進一步減少卡頓現(xiàn)象。

工作線程接收到該數(shù)據(jù)請求后,記錄該數(shù)據(jù)請求中的數(shù)據(jù)位置信息,即記錄主線程需要的行數(shù),遍歷數(shù)據(jù)并填充至緩沖區(qū),填充至緩沖區(qū)的結果集一旦覆蓋了上述數(shù)據(jù)位置信息,則工作線程向主線程發(fā)送通知消息,喚醒主線程繼續(xù)完成渲染過程。

一個示例中,工作線程可以僅將上述數(shù)據(jù)位置信息對應的數(shù)據(jù)填充至緩沖區(qū)。由于在界面顯示過程中,極有可能進行滾動顯示,為了避免后續(xù)滾動時可能需要等待,因此,在另一個示例中,工作線程將上述數(shù)據(jù)位置信息對應的數(shù)據(jù)填充至緩沖區(qū)之后,還可以進一步遍歷接下來的一定長度的數(shù)據(jù)存入緩沖區(qū)中,該長度可以結合實際技術需要進行設定,例如可以通過統(tǒng)計用戶的滾動行為設置該長度。

主線程在接收到工作線程返回的通知消息后,會根據(jù)上述數(shù)據(jù)庫讀取抽象接口從緩沖區(qū)讀取對應的數(shù)據(jù),并進行渲染,同時可以將工作線程的調度優(yōu)先級設置為默認優(yōu)先級,即將工作線程的調度優(yōu)先級調整回原來的調度優(yōu)先級。

在一個示例中,工作線程在所述數(shù)據(jù)位置信息對應的數(shù)據(jù)量超過緩沖區(qū)容量時,可以丟棄緩沖區(qū)最前面的塊,例如緩沖區(qū)的前第二長度數(shù)據(jù),以騰出空間,再將查詢獲得的數(shù)據(jù)填充所述緩沖區(qū),以確保緩沖區(qū)中緩存的是最新請求的數(shù)據(jù)。

需要說明的是,圖3所示中,工作線程可能會睡眠狀態(tài)并進行等待的時間,在實際技術應用中,如果列表滾動的速度或者說主線程發(fā)送數(shù)據(jù)請求的速度大于工作線程填充數(shù)據(jù)的速度,則工作線程將會一直在追趕列表滾動而不會進入睡眠狀態(tài)。

由于工作線程會將更早的數(shù)據(jù)從緩沖區(qū)清除,而在列表類界面的顯示過程中,用戶可能會向上滾動,即可能會需要重新將之前已經(jīng)顯示過的數(shù)據(jù)重新渲染顯示。在顯示列表出現(xiàn)往上滾動時,主線程會根據(jù)滾動到的位置向工作線程發(fā)送數(shù)據(jù)請求,該數(shù)據(jù)請求會攜帶滾動后的數(shù)據(jù)位置信息。

在此情況下,工作線程接收到的是遞減的位置請求,即當前接收到的數(shù)據(jù)請求中的數(shù)據(jù)位置信息小于上一次的數(shù)據(jù)請求中的位置信息,由于工作線程會將更早的數(shù)據(jù)從緩沖區(qū)清除,因此,工作線程會先檢查數(shù)據(jù)位置信息對應的數(shù)據(jù)是否在緩沖區(qū)內(nèi)。如果仍在緩沖區(qū)內(nèi),則工作線程可以不作處理,主線程可以從緩沖區(qū)獲得對應的數(shù)據(jù)進行渲染顯示。如果數(shù)據(jù)位置信息對應的數(shù)據(jù)不在緩沖區(qū)內(nèi),即請求位置已經(jīng)被丟棄,則可以從初始位置遍歷數(shù)據(jù),并在遍歷到所述數(shù)據(jù)位置信息對應的數(shù)據(jù)或者所述數(shù)據(jù)位置信息的前第三長度數(shù)據(jù)時,開始將遍歷到的數(shù)據(jù)填充到緩沖區(qū)。其中,由于接收到了遞減的數(shù)據(jù)位置信息,因此,工作線程可以暫停往下遍歷數(shù)據(jù)的工作,提前進入休眠狀態(tài)。

上述滾動過程中請求數(shù)據(jù)的過程,可以循環(huán)重復的進行。在完成了整個的列表顯示的過程之后,在離開列表界面時,主線程向工作線程發(fā)送退出請求通知,工作線程接收退出請求通知之后關閉查詢并釋放緩沖區(qū),從而完成列表類界面顯示的退出過程的處理。

其中,上述示例中的緩沖區(qū),可以采用分塊緩沖區(qū)來實現(xiàn),以更有益于刪除緩沖區(qū)數(shù)據(jù)和動態(tài)調整緩沖區(qū)大小,其中,每個分塊緩沖區(qū)的可以為固定大小,即具有相同的字節(jié)大小,此時,每個分塊緩沖區(qū)可以視為容量較小的cursorwindow,例如256kb。由于每一行數(shù)據(jù)的大小可能不同,所占用的空間也不一樣,因此,在各分塊緩沖區(qū)的大小相同的情況下,所能容納的行數(shù)也可能會有不同。另一方面,各分塊緩沖區(qū)的大小也可以不相同。圖4中示出了一個示例中的分塊緩沖區(qū)的示意圖,對于每個分塊緩沖區(qū),可記錄每個分塊緩沖區(qū)的起始位置和結束位置,對于每個分塊緩沖區(qū)而言,可以用該分塊緩沖區(qū)的起始位置作為該分塊緩沖區(qū)的索引。

在此情況下,在上述示例的方案中,可以根據(jù)記錄的分塊緩沖區(qū)的起始位置和結束位置,獲取各分塊緩沖區(qū),此時,上述緩沖區(qū)包括獲取的各分塊緩沖區(qū),獲取得到的各分塊緩沖區(qū)的標識,可以加入到緩沖區(qū)索引標識,即緩沖區(qū)索引標識包括各分塊緩沖區(qū)的索引標識,該緩沖區(qū)索引標識可以由工作線程返回給主線程,也可以是與數(shù)據(jù)庫讀取抽象接口相綁定。

另一方面,在上述實施例的方案中,當需要更多的緩沖區(qū)時,即緩沖區(qū)需要增長時,可以分配一個新的分塊緩沖區(qū)并加入到緩沖區(qū)索引標識。在一個示例中,工作線程在基于主線程的數(shù)據(jù)請求向其返回通知消息時,如果該請求的數(shù)據(jù)是在新添加的分塊緩沖區(qū)中,則可以將該分塊緩沖區(qū)的標識返回給主線程,即可以在通知消息中攜帶分塊緩沖區(qū)的索引標識。在另一個示例中,工作線程也可以直接將該分塊緩沖區(qū)的索引標識與數(shù)據(jù)庫讀取抽象接口相綁定,從而主線程可以基于該數(shù)據(jù)庫讀取抽象接口即可從新添加的分塊緩沖區(qū)獲得數(shù)據(jù)并進行渲染。此外,當需要刪除較早的數(shù)據(jù)、騰出部分空間時,刪除對應位置的緩沖區(qū)的分塊即可。

基于分塊緩沖區(qū)的方式,在開始進行數(shù)據(jù)查詢時,可以只申請一個塊,并隨著數(shù)據(jù)遍歷過程,動態(tài)申請更多的分塊緩沖區(qū),并將申請得到的各分塊緩沖區(qū)并在邏輯上連接起來,以達到按需分配內(nèi)存的目的,使得小的結果集只占用較少的內(nèi)存,而大的結果集可以有更大的可以完全緩存的可能性。而且,通過分塊緩沖區(qū)的方式,在滑動過程中列表滑動到緩沖區(qū)之外時,可以無需丟棄整個結果集,只需要丟棄時間最早的或者說存儲的數(shù)據(jù)的位置最早的一個分塊緩沖區(qū),從而大幅提高了往回滾動時數(shù)據(jù)仍在緩沖區(qū)內(nèi)的幾率,提高了列表類顯示界面的性能。

另一方面,由于數(shù)據(jù)庫是一個多用戶共享的資源,為了處理并發(fā)問題會采用數(shù)據(jù)庫鎖機制,因此,在上述實施例的數(shù)據(jù)查詢方法的執(zhí)行過程中,工作線程可能會一直持有未關閉的preparedstatement,因而會一直持有數(shù)據(jù)庫的讀鎖,并占用數(shù)據(jù)庫連接池的一個連接,可能會導致其他數(shù)據(jù)庫操作無法順利進行。因此,在一個示例中,可以在工作線程持有數(shù)據(jù)庫數(shù)據(jù)讀取接口preparedstatement時,注冊一個接口到連接池或者sqlite等待回調接口,一旦出現(xiàn)鎖爭搶,工作線程可以基于不同的策略確定是繼續(xù)持有鎖暫時阻止其他數(shù)據(jù)庫操作,還是暫時放棄鎖允許其他數(shù)據(jù)庫操作。一個示例中的策略包括:在主線程處于等待狀態(tài)時,即主線程發(fā)送的數(shù)據(jù)請求中的數(shù)據(jù)位置信息對應的數(shù)據(jù)未在緩沖區(qū),則繼續(xù)持有鎖;若未填充到請求位置臨界點,如已經(jīng)將主線程發(fā)送的數(shù)據(jù)請求中的數(shù)據(jù)位置信息對應的數(shù)據(jù)填充到了緩沖區(qū),但尚未將該數(shù)據(jù)位置信息之后的一定數(shù)目的數(shù)據(jù)填充到緩沖區(qū),或者是尚未將上述第一長度數(shù)據(jù)填充到緩沖區(qū)則繼續(xù)持有鎖;若工作線程處于等待狀態(tài)或者說睡眠狀態(tài),則暫時放棄鎖。當然,在其他實施例中,也可以做其他的策略設定。

基于本實施例中的數(shù)據(jù)查詢方案,可以優(yōu)化使用數(shù)據(jù)庫查詢的列表類界面的響應速度和流暢性,優(yōu)化了數(shù)據(jù)量比較大的查詢結果集的優(yōu)化效果。

需要說明的是,上述示例中中是以android平臺為例進行說明,本領域技術人員可以理解的是,本實施例的方案同樣也可以適用于其他平臺的客戶端。

基于與上述方法相同的思想,圖5示出了一個實施例中的用于列表類界面顯示的數(shù)據(jù)查詢裝置的結構示意圖。如圖5所示,該實施例中的裝置包括:

主線程模塊501,在進入列表類顯示界面時,向工作線程模塊發(fā)送查詢請求,并根據(jù)工作線程模塊返回的數(shù)據(jù)庫讀取抽象接口從緩沖區(qū)讀取初始長度數(shù)據(jù),并根據(jù)讀取的初始長度數(shù)據(jù)渲染列表,并向工作線程模塊發(fā)送數(shù)據(jù)請求,數(shù)據(jù)請求攜帶數(shù)據(jù)位置信息;

工作線程模塊502,根據(jù)所述查詢請求進行查詢,獲取緩沖區(qū)以及初始長度數(shù)據(jù),將獲取的初始長度數(shù)據(jù)填入所述緩沖區(qū)后,向主線程模塊返回數(shù)據(jù)庫讀取抽象接口,并查詢所述初始長度數(shù)據(jù)之后的第一長度數(shù)據(jù),將查詢獲得的第一長度數(shù)據(jù)填入所述緩沖區(qū);并接收所述數(shù)據(jù)請求,在緩沖區(qū)沒有所述數(shù)據(jù)位置信息對應的數(shù)據(jù)時,記錄所述數(shù)據(jù)位置信息,并在填入緩沖區(qū)的數(shù)據(jù)覆蓋所述數(shù)據(jù)位置信息時,向主線程模塊發(fā)送通知消息。

可以理解,這里的主線程模塊501對應于上述主線程,工作線程模塊502對應于上述工作線程?;诒緦嵤├姆桨?,結合主線程和工作線程兩個線程完成用于列表類界面顯示的數(shù)據(jù)查詢過程,查詢過程始終在工作線程進行,不占用主線程,主線程在進入列表類顯示界面時,向工作線程發(fā)送查詢請求,工作線程接收到該查詢請求后,無需等待緩沖區(qū)填滿,獲得緩沖區(qū)和較小的初始長度數(shù)據(jù)之后,先將緩沖區(qū)和較小的初始長度數(shù)據(jù)返回給主線程進行顯示,且工作線程向主線程返回初始長度數(shù)據(jù)之后,會繼續(xù)查詢初始長度數(shù)據(jù)之后的第一長度數(shù)據(jù),從而使得主線程可以用初始長度數(shù)據(jù)進行初始界面顯示,且可以盡快從工作線程獲得新的查詢數(shù)據(jù)用以界面顯示,使得列表類界面的顯示不再卡頓。

在一個示例中,工作線程模塊502在將查詢獲得的第一長度數(shù)據(jù)填入所述緩沖區(qū)之后,可以進入睡眠狀態(tài),直至接收到主線程模塊501發(fā)送的所述數(shù)據(jù)請求。

上述主線程模塊501向工作線程模塊502發(fā)送的數(shù)據(jù)請求,可以是在任何需要進一步請求數(shù)據(jù)時進行發(fā)送。

在一個示例中,主線程模塊501可以在進入的列表類顯示界面的列表可見部分的所述數(shù)據(jù)位置信息大于所述初始長度數(shù)據(jù)的位置信息時,向工作線程模塊502發(fā)送所述數(shù)據(jù)請求。從而,主線程模塊501在獲得初始長度數(shù)據(jù)進行渲染顯示之后,如果初始長度數(shù)據(jù)無法渲染全部的初始顯示界面,即可見部分的位置信息大于初始長度數(shù)據(jù)的位置信息,則向工作線程模塊502發(fā)送數(shù)據(jù)請求,以獲得更多的數(shù)據(jù)進行當前顯示界面的顯示。

另一方面,主線程模塊501也可以在滾動的過程中向工作線程模塊502發(fā)送上述數(shù)據(jù)請求,以請求新的數(shù)據(jù)進行渲染顯示。此時主線程模塊501,在接收到界面滾動指令時,滾動并繪制滾動后列表界面,將滾動后列表界面的當前可見部分的最大位置信息作為所述數(shù)據(jù)位置信息,向工作線程模塊502發(fā)送所述數(shù)據(jù)請求。

其中,主線程模塊501在向工作線程模塊502發(fā)送所述數(shù)據(jù)請求后,可以在滿足調度優(yōu)先級調整條件時,提高工作線程模塊502的調度優(yōu)先級。從而,在主線程模塊501向工作線程模塊502發(fā)送數(shù)據(jù)請求后,如果工作線程模塊502已經(jīng)將工作將上述數(shù)據(jù)位置信息對應的數(shù)據(jù)填充到緩沖區(qū),則主線程模塊501可以直接從緩沖區(qū)拿到數(shù)據(jù)進行渲染。如果工作線程模塊502尚未將數(shù)據(jù)位置信息對應的數(shù)據(jù)填充到緩沖區(qū),則主線程模塊501需要等待。此時,主線程模塊501通過提高工作線程模塊502的調度優(yōu)先級,可以使得工作線程模塊502可以盡快將需要的數(shù)據(jù)填充到緩沖區(qū),進一步減少卡頓現(xiàn)象。

其中,這里的調度優(yōu)先級調整條件,可以結合實際需要進行設置。一個示例中,主線程模塊501可以是在向工作線程模塊502發(fā)送數(shù)據(jù)請求之后,在預定時間段內(nèi)未接收到工作線程模塊502返回的通知消息時,判定滿足調度優(yōu)先級調整條件。在另一個示例中,由于上述工作線程模塊502已經(jīng)向主線程模塊501返回了緩沖區(qū)索引標識,因此,主線程模塊501在向工作線程模塊502發(fā)送數(shù)據(jù)請求之后,可以先嘗試從緩沖區(qū)索引標識對應的緩沖區(qū)讀取對應的數(shù)據(jù),若未讀取到對應的數(shù)據(jù),則判定滿足調度優(yōu)先級調整條件。在其他示例中,對調度優(yōu)先級調整條件,也可以做其他不同的設定。

在上述提高了工作線程的調度優(yōu)先級之后,主線程模塊501還可以在接收到工作線程模塊502返回的上述通知消息時,將工作線程模塊502的調度優(yōu)先級設置為默認優(yōu)先級,即將工作線程模塊502的調度優(yōu)先級調整回原來的調度優(yōu)先級。

由于在列表類界面顯示的過程中,由于主線程模塊501可能會基于不斷的滾動過程,不斷地查詢新的數(shù)據(jù)進行顯示,而緩沖區(qū)的容量本身是有限的。因此,在一個示例中,工作線程模塊502在所述數(shù)據(jù)位置信息對應的數(shù)據(jù)量超過緩沖區(qū)容量時,可以丟棄緩沖區(qū)的前第二長度數(shù)據(jù)后,再將查詢獲得的數(shù)據(jù)填充所述緩沖區(qū),以確保緩沖區(qū)中緩存的是最新請求的數(shù)據(jù)。

主線程模塊501在離開列表界面時,向工作線程模塊502發(fā)送退出請求通知,工作線程模塊502接收退出請求通知之后關閉查詢并釋放緩沖區(qū),從而完成列表類界面顯示的退出過程的處理。

在本示例的方案中,緩沖區(qū)可以由分塊緩沖區(qū)來實現(xiàn),其中,各分塊緩沖區(qū)的大小可以相同,也可以不相同。每個分塊緩沖區(qū)均可以有起始位置和結束位置,在需要填充新的數(shù)據(jù)、增長緩沖區(qū)時,分配一個新的分塊緩沖區(qū)并將該分塊緩沖區(qū)的標識添加到上述緩沖區(qū)索引標識即可。從而工作線程模塊502,可以根據(jù)記錄的分塊緩沖區(qū)的起始位置和結束位置,獲取各分塊緩沖區(qū),所述緩沖區(qū)包括獲取的各分塊緩沖區(qū),各分塊緩沖區(qū)的大小相同或不同。在此情況下,在需要刪除緩沖區(qū)的數(shù)據(jù)時,可以直接刪除對應位置的分塊緩沖區(qū)即可。

基于如上所述的示例,在一個實施例中還提供一種計算機設備,該計算機設備包括存儲器、處理器及存儲在存儲器上并可在處理器上運行的計算機程序,其中,處理器執(zhí)行所述程序時實現(xiàn)如上述各實施例中的任意一種用于列表類界面顯示的數(shù)據(jù)查詢方法。

本領域普通技術人員可以理解實現(xiàn)上述實施例方法中的全部或部分流程,是可以通過計算機程序來指令相關的硬件來完成,所述的程序可存儲于一非易失性的計算機可讀取存儲介質中,如本發(fā)明實施例中,該程序可存儲于計算機系統(tǒng)的存儲介質中,并被該計算機系統(tǒng)中的至少一個處理器執(zhí)行,以實現(xiàn)包括如上述各方法的實施例的流程。其中,所述的存儲介質可為磁碟、光盤、只讀存儲記憶體(read-onlymemory,rom)或隨機存儲記憶體(randomaccessmemory,ram)等。

據(jù)此,在一個實施例中還提供一種存儲介質,其上存儲有計算機程序,其中,該程序被處理器執(zhí)行時實現(xiàn)如上述各實施例中的任意一種用于列表類界面顯示的數(shù)據(jù)查詢方法。

以上所述實施例的各技術特征可以進行任意的組合,為使描述簡潔,未對上述實施例中的各個技術特征所有可能的組合都進行描述,然而,只要這些技術特征的組合不存在矛盾,都應當認為是本說明書記載的范圍。

以上所述實施例僅表達了本發(fā)明的幾種實施方式,其描述較為具體和詳細,但并不能因此而理解為對發(fā)明專利范圍的限制。應當指出的是,對于本領域的普通技術人員來說,在不脫離本發(fā)明構思的前提下,還可以做出若干變形和改進,這些都屬于本發(fā)明的保護范圍。因此,本發(fā)明專利的保護范圍應以所附權利要求為準。

當前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1