一種快速顯示大容量數(shù)據(jù)信息的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明實(shí)現(xiàn)了一種利用線程池中固定線程數(shù)量進(jìn)行數(shù)據(jù)信息批量加載,從緩存文件中快速讀取數(shù)據(jù)信息的方法。
【背景技術(shù)】
[0002]移動互聯(lián)網(wǎng)的快速發(fā)展是當(dāng)今科技領(lǐng)域不可忽視的潮流,其給用戶帶來了全新的體驗,在滿足廣大用戶的需求上扮演著越來越重要的角色。而隨著Android系統(tǒng)在互聯(lián)網(wǎng)運(yùn)用中越來越廣泛,那么如何從服務(wù)端上高效率的獲取圖片等資源進(jìn)行開發(fā),并且保證良好的軟件結(jié)構(gòu),就成了Android研發(fā)中的一個關(guān)鍵。Android應(yīng)用中經(jīng)常從網(wǎng)絡(luò)中加載大量圖片就是一個很好的例子。
[0003]目前的Android技術(shù)中雖也有采用異步下載信息資源的方法,以達(dá)到快速刷新View的目的。但是當(dāng)有大量信息資源在下載,并且View的刷新速度要求非??鞎r,就無法對線程進(jìn)行安全的控制,系統(tǒng)資源也會產(chǎn)生大量浪費(fèi),最終信息的顯示速度也會受到影響。現(xiàn)在利用線程池和二級緩存,可以安全有效的下載信息和快速的刷新。
【發(fā)明內(nèi)容】
[0004]為了解決上述問題,本發(fā)明提供了一種利用線程池和二級緩存,快速顯示大容量數(shù)據(jù)信息的方法。
[0005]為了達(dá)到上述目的,本發(fā)明所設(shè)計的快速顯示大容量數(shù)據(jù)信息的方法,包括以下步驟:
步驟1:創(chuàng)建一個固定大小的線程池,該線程池是專門用來進(jìn)行數(shù)據(jù)信息的處理,包括緩存數(shù)據(jù)信息獲取、文件數(shù)據(jù)信息獲取和網(wǎng)絡(luò)數(shù)據(jù)信息獲??;
步驟2:申請一塊固定大小的緩存,用來存放從文件中或網(wǎng)絡(luò)上獲取的數(shù)據(jù)信息,每一個數(shù)據(jù)信息的存放以Url為關(guān)鍵字,以保證緩存中每一個數(shù)據(jù)的唯一性,獲取數(shù)據(jù)的準(zhǔn)確性;
步驟3:創(chuàng)建一個獲取數(shù)據(jù)任務(wù)隊列,用以存放每一個獲取數(shù)據(jù)的任務(wù)請求,當(dāng)用戶發(fā)送一個請求時,就將該任務(wù)請求加入任務(wù)隊列;當(dāng)完成一個任務(wù)請求時,就把該任務(wù)從隊列中刪除掉;
步驟4:從任務(wù)隊列中獲取任務(wù),然后利用二級緩存原理從中獲取數(shù)據(jù)信息,如果內(nèi)存中沒有則從文件中獲取;如果文件中也沒有,才從網(wǎng)絡(luò)中獲取,為了下次的便宜運(yùn)用,從文件中獲取數(shù)據(jù)信息后把它加入內(nèi)存中;當(dāng)從網(wǎng)絡(luò)中獲取數(shù)據(jù)信息后把它加入到內(nèi)存和文件中;
步驟5:因為Android的UI顯示是要在主線程上的,所以通過Handler機(jī)制把獲取到的數(shù)據(jù)信息傳到主線程上,然后運(yùn)用Android的動態(tài)方式Transit1n或者根據(jù)客戶需要的動態(tài)效果自行去顯示該信息,
步驟6:循環(huán)步驟4和5,直到任務(wù)列表為空。
[0006]本發(fā)明所得到的快速顯示大容量數(shù)據(jù)信息的方法,具有以下特點(diǎn):
1:為了節(jié)約系統(tǒng)資源,減少系統(tǒng)擁擠率,達(dá)到運(yùn)行的最佳效果,創(chuàng)建了一個固定大小的線程池,限制系統(tǒng)中執(zhí)行線程的數(shù)量。用線程池控制線程數(shù)量,其他線程排隊等候。一個任務(wù)執(zhí)行完畢,再從隊列中取最前面的任務(wù)開始執(zhí)行。若隊列中沒有等待進(jìn)程,線程池的這一資源處于等待。當(dāng)一個新任務(wù)需要運(yùn)行時,如果線程池中有等待的工作線程,就可以開始運(yùn)行了;否則進(jìn)入等待隊列。
[0007]線程池減少了創(chuàng)建和銷毀線程的次數(shù),每個工作線程都可以被重復(fù)利用,可執(zhí)行多個任務(wù)。它可以根據(jù)系統(tǒng)的承受能力,調(diào)整線程池中工作線線程的數(shù)量,防止因為消耗過多的內(nèi)存,而把服務(wù)器累趴下(每個線程需要大約IMB內(nèi)存,線程開的越多,消耗的內(nèi)存也就越大,最后死機(jī))。
[0008]創(chuàng)建固定大小的線程池,每次提交一個任務(wù)就創(chuàng)建一個線程,直到線程達(dá)到線程池的最大大小。線程池的大小一旦達(dá)到最大值就會保持不變,如果某個線程因為執(zhí)行異常而結(jié)束,那么線程池會補(bǔ)充一個新線程。
[0009]2:在系統(tǒng)加載大量信息時,為了提高加載速度和效率,減少網(wǎng)絡(luò)流量采用了二級緩存和異步加載機(jī)制,所謂二級緩存就是通過先從內(nèi)存中獲取(按鍵值key-vaIue從Map中獲取),再從文件或sqlite中獲取,最后才訪問網(wǎng)絡(luò)。當(dāng)獲得來自網(wǎng)絡(luò)的數(shù)據(jù)后,就以key-value的方式存儲url和數(shù)據(jù)信息到HashMap中(一級緩存),同時存儲到文件或sqlite中(二級緩存)。
[0010]為防止內(nèi)存緩存造成堆內(nèi)存泄露,所以一級緩存嚴(yán)格控制緩存的大小,設(shè)置為系統(tǒng)的1/4。
[0011]3:為了增加用戶的視覺效果,在信息顯示時可以增加動態(tài)效果,比如圖片旋轉(zhuǎn)、圓形頭像等。
[0012]綜上所述,本發(fā)明所得到的方法具有以下優(yōu)點(diǎn):提高了加載速度,節(jié)省了數(shù)據(jù)流量。避免了在ListView頻繁更新數(shù)據(jù)、快速刷新信息時,某個信息要很久才顯示或者卡在某個操作上的情況。節(jié)約了系統(tǒng)資源,減少了系統(tǒng)資源的擁擠率,達(dá)到運(yùn)行的最佳效果,避免了運(yùn)行線程過多和無法控制等現(xiàn)象產(chǎn)生。
【附圖說明】
[0013]圖1是實(shí)施例1利用本發(fā)明的方法快速顯示圖片的流程圖。
【具體實(shí)施方式】
[0014]下面結(jié)合Android中的一個實(shí)施例參照附圖進(jìn)行詳細(xì)說明,以便對本發(fā)明的技術(shù)特征和優(yōu)點(diǎn)進(jìn)行更深入的詮釋。
[0015]實(shí)施例1
如圖1所示,本實(shí)施例描述的快速顯示大容量數(shù)據(jù)信息的方法,假設(shè)顯示某個網(wǎng)站上的大批量產(chǎn)品圖片,下面將詳細(xì)說明上述加載在Android應(yīng)用中的實(shí)現(xiàn)方法。其具體實(shí)現(xiàn)步驟如下:
步驟1:創(chuàng)建一個5個線程的線程池。為了保證線程池的安全性,利用了線程安全的原子操作。
[0016]步驟2:申請一塊5M大小的緩存,用來存放從文件或網(wǎng)絡(luò)上獲取的圖片。以key-value的方式將每一張圖片存儲到哈希列表HashMap中,其中關(guān)鍵字key為該圖片的連接Url0
[0017]步驟3:創(chuàng)建一個獲取圖片任務(wù)隊列,用以存放每一個獲取圖片的任務(wù)請求。
[0018]注意:對任務(wù)隊列進(jìn)行操作時一定要加鎖,以防止其它也操作任務(wù)隊列導(dǎo)致數(shù)據(jù)混亂。
[0019]步驟4:現(xiàn)在接收到一個圖片任務(wù)。將該任務(wù)加入到任務(wù)隊列。
[0020]步驟5:判斷線程中運(yùn)行的線程是否已達(dá)到飽和。如已飽和則等待;如沒飽和則進(jìn)行線程原子增加操作mNowRunning.1ncrementAndGet (),表明該線程池中增加一條運(yùn)行的線程,并繼續(xù)步驟6。
[0021]步驟6:判斷任務(wù)隊列中有沒有任務(wù)。如有任務(wù)則取出該任務(wù)并執(zhí)行(執(zhí)行步驟7);如無任務(wù)則進(jìn)行線程原子減操作mNowRunning.decrementAndGet()(執(zhí)行步驟13)。
[0022]步驟7:緩存中是否存在該圖片。如存在則直接顯示圖片(執(zhí)行步驟11);如不存在則從文件去獲取(執(zhí)行步驟8)。
[0023]步驟8:文件中是否存在該圖片。如存在則把該圖片保存到緩存,并去顯示(執(zhí)行步驟10);如不存在則繼續(xù)去網(wǎng)絡(luò)獲取(執(zhí)行步驟9)。
[0024]步驟9:用Http從網(wǎng)絡(luò)上獲取圖片。獲取后進(jìn)行保存(執(zhí)行步驟10)。
[0025]步驟10:將獲取到的圖片保存到緩存和文件中。此時如果緩存達(dá)到界值,則需要清理,以免內(nèi)存泄露。
[0026]步驟11:因為Android的UI顯示主要在主線程上的,所以通過Handler機(jī)制把獲取到的圖片傳到主線程中。通過Andr ο i d的T rans iton進(jìn)行淡入顯示該圖片。
[0027]步驟12:完成取出的圖片任務(wù)后,去執(zhí)行下一個任務(wù)(執(zhí)行步驟6)。
[0028]步驟13:線程池中的線程原子減操作,說明該線程是空的,已經(jīng)執(zhí)行完了。
【主權(quán)項】
1.一種快速顯示大容量數(shù)據(jù)信息的方法,包括以下步驟: 步驟1:創(chuàng)建一個固定大小的線程池,該線程池是專門用來進(jìn)行數(shù)據(jù)信息的處理,包括緩存數(shù)據(jù)信息獲取、文件數(shù)據(jù)信息獲取和網(wǎng)絡(luò)數(shù)據(jù)信息獲取; 步驟2:申請一塊固定大小的緩存,用來存放從文件中或網(wǎng)絡(luò)上獲取的數(shù)據(jù)信息,每一個數(shù)據(jù)信息的存放以Url為關(guān)鍵字,以保證緩存中每一個數(shù)據(jù)的唯一性,獲取數(shù)據(jù)的準(zhǔn)確性; 步驟3:創(chuàng)建一個獲取數(shù)據(jù)任務(wù)隊列,用以存放每一個獲取數(shù)據(jù)的任務(wù)請求,當(dāng)用戶發(fā)送一個請求時,就將該任務(wù)請求加入任務(wù)隊列;當(dāng)完成一個任務(wù)請求時,就把該任務(wù)從隊列中刪除掉; 步驟4:從任務(wù)隊列中獲取任務(wù),然后利用二級緩存原理從中獲取數(shù)據(jù)信息,如果內(nèi)存中沒有則從文件中獲取;如果文件中也沒有,才從網(wǎng)絡(luò)中獲取,為了下次的便宜運(yùn)用,從文件中獲取數(shù)據(jù)信息后把它加入內(nèi)存中;當(dāng)從網(wǎng)絡(luò)中獲取數(shù)據(jù)信息后把它加入到內(nèi)存和文件中; 步驟5:因為Android的UI顯示是要在主線程上的,所以通過Handler機(jī)制把獲取到的數(shù)據(jù)信息傳到主線程上,然后運(yùn)用Android的動態(tài)方式Transit1n或者根據(jù)客戶需要的動態(tài)效果自行去顯示該信息, 步驟6:循環(huán)步驟4和5,直到任務(wù)列表為空。
【專利摘要】本發(fā)明所設(shè)計的一種快速顯示大量數(shù)據(jù)信息的方法,利用固定線程池,可以多個線程去執(zhí)行數(shù)據(jù)信息獲取任務(wù),而不會產(chǎn)生數(shù)據(jù)混亂。把任務(wù)請求放在同一個任務(wù)列表中,每次操作任務(wù)列表必須鎖住該列表。從任務(wù)列表中獲取未完成的任務(wù),然后通過二級緩存獲取數(shù)據(jù)。如通過文件或網(wǎng)絡(luò)獲取到的數(shù)據(jù),則相應(yīng)的加到內(nèi)存或文件內(nèi),以便宜下次運(yùn)用。完成所取任務(wù)后,從任務(wù)列表中刪除該任務(wù),并取出下一個任務(wù)。本發(fā)明所得到的方法具有以下優(yōu)點(diǎn):提高了加載速度,節(jié)省了數(shù)據(jù)流量。避免了在Listview頻繁更新數(shù)據(jù)、快速刷新信息時,某個信息要很久才顯示或者卡在某個操作上的情況。節(jié)約了系統(tǒng)資源,減少了系統(tǒng)資源的擁擠率,達(dá)到運(yùn)行的最佳效果。
【IPC分類】G06F17/30, G06F9/44
【公開號】CN105653610
【申請?zhí)枴?br>【發(fā)明人】金昊炫, 吳斌斌, 康克勤, 宋潔珺, 李金龍
【申請人】數(shù)源科技股份有限公司
【公開日】2016年6月8日
【申請日】2015年12月25日