一種解決樹控件節(jié)點(diǎn)數(shù)量限制的方法
【技術(shù)領(lǐng)域】
[0001 ]本發(fā)明涉及一種解決樹控件節(jié)點(diǎn)數(shù)量限制的方法。
【背景技術(shù)】
[0002]在計(jì)算機(jī)軟件界面的設(shè)計(jì)中,經(jīng)常要使用到樹控件來展現(xiàn)一些有層級關(guān)系的數(shù)據(jù)。傳統(tǒng)的樹控件采用同步加載,并一次性加載所有的節(jié)點(diǎn)數(shù)據(jù)進(jìn)行展現(xiàn)。隨著系統(tǒng)數(shù)據(jù)量逐步增長,當(dāng)一個(gè)樹控件的節(jié)點(diǎn)數(shù)達(dá)到上萬甚至更多時(shí),傳統(tǒng)的樹控件就會(huì)遇到數(shù)據(jù)無法從后臺(tái)成功加載、數(shù)據(jù)節(jié)點(diǎn)過多導(dǎo)致界面卡死甚至整個(gè)界面崩潰等問題。而由于樹控件節(jié)點(diǎn)數(shù)量瓶頸的存在,嚴(yán)重制約著軟件界面設(shè)計(jì)的發(fā)展。
【發(fā)明內(nèi)容】
[0003]本發(fā)明的目的在于提供一種解決樹控件節(jié)點(diǎn)數(shù)量限制的方法,解決樹控件在節(jié)點(diǎn)數(shù)量多的情況下,無法從后臺(tái)加載數(shù)據(jù)且前端展現(xiàn)卡死問題。
[0004]本發(fā)明一種解決樹控件節(jié)點(diǎn)數(shù)量限制的方法,包括如下步驟:
步驟1、當(dāng)軟件界面剛展現(xiàn)時(shí),樹控件只顯示根節(jié)點(diǎn),當(dāng)用戶點(diǎn)擊根節(jié)點(diǎn)時(shí),通過異步方式向系統(tǒng)后臺(tái)獲取所有的下級子節(jié)點(diǎn)數(shù)據(jù),分批加載子節(jié)點(diǎn)數(shù)據(jù),然后,將加載到的子節(jié)點(diǎn)數(shù)據(jù)緩存到本地?cái)?shù)組中,最后根據(jù)樹控件上當(dāng)前處于可見區(qū)域并處于展開狀態(tài)的節(jié)點(diǎn),從本地?cái)?shù)組中讀取對應(yīng)的子節(jié)點(diǎn)數(shù)據(jù)并渲染到樹控件上展現(xiàn);
步驟2、樹控件只留下處于可見區(qū)域并且處于展開狀態(tài)下的節(jié)點(diǎn)數(shù)據(jù),其余的節(jié)點(diǎn)數(shù)據(jù)一旦處于隱藏或收縮后的狀態(tài),立即自動(dòng)移除,如果樹控件的滾動(dòng)條滑動(dòng)到節(jié)點(diǎn)使之可見時(shí),程序?qū)⒆詣?dòng)加載該可見節(jié)點(diǎn)的節(jié)點(diǎn)數(shù)據(jù),同時(shí)把離開可見區(qū)域的節(jié)點(diǎn)數(shù)據(jù)移除。
[0005]所述的步驟I具體實(shí)現(xiàn)方式為:
前端傳遞父節(jié)點(diǎn)ID參數(shù)給后臺(tái),后臺(tái)檢索出父節(jié)點(diǎn)ID下有N個(gè)子節(jié)點(diǎn)數(shù)據(jù),該N個(gè)子節(jié)點(diǎn)數(shù)據(jù)分M批返回給前端;
前端把接收到的節(jié)點(diǎn)數(shù)據(jù),按層級關(guān)系存儲(chǔ)到本地?cái)?shù)組中,根據(jù)樹控件上當(dāng)前處于可見區(qū)域并處于展開狀態(tài)的節(jié)點(diǎn),從本地?cái)?shù)組中讀取對應(yīng)的子節(jié)點(diǎn)數(shù)據(jù)并渲染到樹控件上展現(xiàn)。
[0006]本發(fā)明采用分批次異步加載方法來解決后臺(tái)樹控件無法一次性加載成功的問題。具體方法為:當(dāng)軟件界面剛剛展現(xiàn)時(shí),樹控件只顯示根節(jié)點(diǎn),而不是展現(xiàn)所有的節(jié)點(diǎn),當(dāng)用戶點(diǎn)擊根節(jié)點(diǎn)時(shí),通過異步方式向系統(tǒng)后臺(tái)獲取下級節(jié)點(diǎn)數(shù)據(jù),同時(shí)為了確保節(jié)點(diǎn)數(shù)據(jù)能成功加載,把傳統(tǒng)的一次性加載改為分批加載。例如:某節(jié)點(diǎn)下有10000個(gè)了節(jié)點(diǎn),一次性加載可能會(huì)加載失敗,現(xiàn)在可以改分為10次自動(dòng)加載,每次加載1000條數(shù)據(jù)。然后,將加載到的數(shù)據(jù)緩存到本地?cái)?shù)組,最后從數(shù)組里面讀取子節(jié)點(diǎn)數(shù)據(jù)并渲染到樹控件上展現(xiàn)。
[0007]本發(fā)明通過動(dòng)態(tài)加載可見區(qū)域的節(jié)點(diǎn)數(shù)據(jù)并移除非可見區(qū)的節(jié)點(diǎn)數(shù)據(jù),來解決樹控件節(jié)點(diǎn)數(shù)量多時(shí),界面卡死問題。樹控件的每個(gè)節(jié)點(diǎn)都需要消耗一定的內(nèi)存和CPU。當(dāng)樹控件的節(jié)點(diǎn)數(shù)量達(dá)到一定量時(shí),操作系統(tǒng)的內(nèi)存、CPU等資源將會(huì)被消耗完。此時(shí)軟件界面就會(huì)出現(xiàn)卡死、甚至整個(gè)界面崩潰等問題。本發(fā)明的樹控件只留下處于可見區(qū)域并且處于展開狀態(tài)下的節(jié)點(diǎn)數(shù)據(jù),其余的節(jié)點(diǎn)數(shù)據(jù)一旦處于隱藏或收縮后的狀態(tài),立即自動(dòng)移除。比如樹控件下有A、B、C、D、E等五個(gè)節(jié)點(diǎn),而展現(xiàn)在界面的可見區(qū)域只有A和B兩個(gè)節(jié)點(diǎn),且A和B兩節(jié)點(diǎn)處于展開狀態(tài),此時(shí)將自動(dòng)移除掉不可見的C、D、E的節(jié)點(diǎn)數(shù)據(jù);如果樹控件的滾動(dòng)條滑動(dòng)到C節(jié)點(diǎn)可見時(shí),程序?qū)⒆詣?dòng)加載C節(jié)點(diǎn)的數(shù)據(jù),同時(shí)把離開可見區(qū)的節(jié)點(diǎn)數(shù)據(jù)移除。由此可減少整個(gè)樹控件對計(jì)算機(jī)資源的消耗,即能提高計(jì)算機(jī)資源的有效利用率,同時(shí)可解決樹控件卡死的問題,從而根本性地突破樹控件對節(jié)點(diǎn)數(shù)量的限制。
【具體實(shí)施方式】
[0008]本發(fā)明中樹控件具有后臺(tái)服務(wù)和前端展現(xiàn)兩個(gè)子功能,后臺(tái)負(fù)責(zé)給前端展現(xiàn)提供節(jié)點(diǎn)數(shù)據(jù),前端負(fù)責(zé)接收來自后臺(tái)的節(jié)點(diǎn)數(shù)據(jù)并展現(xiàn);樹控件的每個(gè)節(jié)點(diǎn)有一個(gè)ID值,此節(jié)點(diǎn)ID作為樹節(jié)點(diǎn)的唯一標(biāo)識(shí)。
[0009]本發(fā)明一種解決樹控件節(jié)點(diǎn)數(shù)量限制的方法,具體包括如下步驟:
步驟1、當(dāng)軟件界面剛展現(xiàn)時(shí),樹控件只顯示根節(jié)點(diǎn),當(dāng)用戶點(diǎn)擊根節(jié)點(diǎn)時(shí),通過異步方式向系統(tǒng)后臺(tái)獲取所有的下級子節(jié)點(diǎn)數(shù)據(jù),分批加載子節(jié)點(diǎn)數(shù)據(jù),然后,將加載到的子節(jié)點(diǎn)數(shù)據(jù)緩存到本地?cái)?shù)組中,最后根據(jù)樹控件上當(dāng)前處于可見區(qū)域并處于展開狀態(tài)的節(jié)點(diǎn),從本地?cái)?shù)組中讀取對應(yīng)的子節(jié)點(diǎn)數(shù)據(jù)并渲染到樹控件上展現(xiàn):
前端傳遞父節(jié)點(diǎn)ID參數(shù)給后臺(tái),后臺(tái)檢索出父節(jié)點(diǎn)ID下有N個(gè)子節(jié)點(diǎn)數(shù)據(jù),假定檢索到10000個(gè)子節(jié)點(diǎn),假定后臺(tái)每批次返回給前端1000個(gè)子節(jié)點(diǎn),即所有的子節(jié)點(diǎn)數(shù)據(jù)分為10批次返回給前端;
前端把接收到的節(jié)點(diǎn)數(shù)據(jù),按層級關(guān)系存儲(chǔ)到本地?cái)?shù)組中,假定本地?cái)?shù)組下存儲(chǔ)的數(shù)據(jù)有[A,B,C,D,E]五個(gè)節(jié)點(diǎn)數(shù)據(jù);
假定樹控件當(dāng)前可見的節(jié)點(diǎn)有A和B兩個(gè),且A和B兩個(gè)節(jié)點(diǎn)都處于展開的狀態(tài),此時(shí)樹控件將從數(shù)組里讀取A和B兩個(gè)節(jié)點(diǎn)的數(shù)據(jù),并渲染到樹控件上展現(xiàn);
步驟2、樹控件只留下處于可見區(qū)域并且處于展開狀態(tài)下的節(jié)點(diǎn)數(shù)據(jù),其余的節(jié)點(diǎn)數(shù)據(jù)一旦處于隱藏或收縮后的狀態(tài),立即自動(dòng)移除,如果樹控件的滾動(dòng)條滑動(dòng)到節(jié)點(diǎn)使之可見時(shí),程序?qū)⒆詣?dòng)加載該可見節(jié)點(diǎn)的節(jié)點(diǎn)數(shù)據(jù),同時(shí)把離開可見區(qū)域的節(jié)點(diǎn)數(shù)據(jù)移除:
當(dāng)樹控件的滾動(dòng)條滑動(dòng)至C和D節(jié)點(diǎn)時(shí),隨著滾動(dòng)條的滑動(dòng),A和B兩節(jié)點(diǎn)由可見狀態(tài)變?yōu)椴豢梢姞顟B(tài),此時(shí)樹控件自動(dòng)把A和B兩節(jié)點(diǎn)的數(shù)據(jù)從樹控件上移除,同時(shí)又從數(shù)組中讀取C和D的節(jié)點(diǎn)數(shù)據(jù)并渲染到樹控件上展現(xiàn);若樹控件的滾動(dòng)條重新滑動(dòng)到B節(jié)點(diǎn)時(shí),此時(shí)樹控件又從數(shù)組中讀取B節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行展現(xiàn),同時(shí)把變?yōu)殡[藏狀態(tài)的所有節(jié)點(diǎn)數(shù)據(jù)從樹控件上移除,滾動(dòng)條至B節(jié)點(diǎn)可見時(shí),樹控件又重新加載B節(jié)點(diǎn)的數(shù)據(jù)展現(xiàn),并移除掉變?yōu)椴豢梢姞顟B(tài)的D節(jié)點(diǎn)數(shù)據(jù),以后的操作流程依此類推。
[0010]本發(fā)明通過分批次異步加載節(jié)點(diǎn)數(shù)據(jù),提高了樹節(jié)點(diǎn)數(shù)據(jù)加載的成功率,降低了由于樹控件節(jié)點(diǎn)數(shù)據(jù)加載失敗而導(dǎo)致的一系列故障;通過動(dòng)態(tài)加載可見區(qū)域的節(jié)點(diǎn)數(shù)據(jù)并移除非可見區(qū)的節(jié)點(diǎn)數(shù)據(jù),有效降低了樹控件對操作系統(tǒng)內(nèi)存、CPU等資源的消耗,提高了操作系統(tǒng)資源的利用率,解決了樹控件過度消耗操作系統(tǒng)資源而導(dǎo)致界面卡死等問題,從而根本性地突破樹控件對節(jié)點(diǎn)數(shù)量的限制。
[0011]以上所述,僅是本發(fā)明較佳實(shí)施例而已,并非對本發(fā)明的技術(shù)范圍作任何限制,故凡是依據(jù)本發(fā)明的技術(shù)實(shí)質(zhì)對以上實(shí)施例所作的任何細(xì)微修改、等同變化與修飾,均仍屬于本發(fā)明技術(shù)方案的范圍內(nèi)。
【主權(quán)項(xiàng)】
1.一種解決樹控件節(jié)點(diǎn)數(shù)量限制的方法,其特征在于包括如下步驟: 步驟1、當(dāng)軟件界面剛展現(xiàn)時(shí),樹控件只顯示根節(jié)點(diǎn),當(dāng)用戶點(diǎn)擊根節(jié)點(diǎn)時(shí),通過異步方式向系統(tǒng)后臺(tái)獲取所有的下級子節(jié)點(diǎn)數(shù)據(jù),分批加載子節(jié)點(diǎn)數(shù)據(jù),然后,將加載到的子節(jié)點(diǎn)數(shù)據(jù)緩存到本地?cái)?shù)組中,最后根據(jù)樹控件上當(dāng)前處于可見區(qū)域并處于展開狀態(tài)的節(jié)點(diǎn),從本地?cái)?shù)組中讀取對應(yīng)的子節(jié)點(diǎn)數(shù)據(jù)并渲染到樹控件上展現(xiàn); 步驟2、樹控件只留下處于可見區(qū)域并且處于展開狀態(tài)下的節(jié)點(diǎn)數(shù)據(jù),其余的節(jié)點(diǎn)數(shù)據(jù)一旦處于隱藏或收縮后的狀態(tài),立即自動(dòng)移除,如果樹控件的滾動(dòng)條滑動(dòng)到節(jié)點(diǎn)使之可見時(shí),程序?qū)⒆詣?dòng)加載該可見節(jié)點(diǎn)的節(jié)點(diǎn)數(shù)據(jù),同時(shí)把離開可見區(qū)域的節(jié)點(diǎn)數(shù)據(jù)移除。2.根據(jù)權(quán)利要求1所述的一種解決樹控件節(jié)點(diǎn)數(shù)量限制的方法,其特征在于步驟I具體實(shí)現(xiàn)方式為: 前端傳遞父節(jié)點(diǎn)ID參數(shù)給后臺(tái),后臺(tái)檢索出父節(jié)點(diǎn)ID下有N個(gè)子節(jié)點(diǎn)數(shù)據(jù),該N個(gè)子節(jié)點(diǎn)數(shù)據(jù)分M批返回給前端; 前端把接收到的節(jié)點(diǎn)數(shù)據(jù),按層級關(guān)系存儲(chǔ)到本地?cái)?shù)組中,根據(jù)樹控件上當(dāng)前處于可見區(qū)域并處于展開狀態(tài)的節(jié)點(diǎn),從本地?cái)?shù)組中讀取對應(yīng)的子節(jié)點(diǎn)數(shù)據(jù)并渲染到樹控件上展現(xiàn)。
【專利摘要】本發(fā)明一種解決樹控件節(jié)點(diǎn)數(shù)量限制的方法,通過分批次異步加載節(jié)點(diǎn)數(shù)據(jù),提高了樹節(jié)點(diǎn)數(shù)據(jù)加載的成功率,降低了由于樹控件節(jié)點(diǎn)數(shù)據(jù)加載失敗而導(dǎo)致的一系列故障;通過動(dòng)態(tài)加載可見區(qū)域的節(jié)點(diǎn)數(shù)據(jù)并移除非可見區(qū)的節(jié)點(diǎn)數(shù)據(jù),有效降低了樹控件對操作系統(tǒng)內(nèi)存、CPU等資源的消耗,提高了操作系統(tǒng)資源的利用率,解決了樹控件過度消耗操作系統(tǒng)資源而導(dǎo)致界面卡死等問題,從而根本性地突破樹控件對節(jié)點(diǎn)數(shù)量的限制。
【IPC分類】G06F9/44
【公開號】CN105468365
【申請?zhí)枴緾N201510805867
【發(fā)明人】吳超民, 劉志芳, 謝燕玲, 崔躍
【申請人】廈門雅迅網(wǎng)絡(luò)股份有限公司
【公開日】2016年4月6日
【申請日】2015年11月20日