本發(fā)明涉及異步數(shù)據(jù)處理領(lǐng)域,具體涉及一種具有同步回調(diào)信息功能的數(shù)據(jù)異步處理方法及模塊。
背景技術(shù):
通常在Android的應(yīng)用開(kāi)發(fā)過(guò)程中,會(huì)經(jīng)常使用異步處理數(shù)據(jù)的功能;由于Android的UI(User Interface,用戶界面)界面是工作在主線程的,因此若一些非常耗時(shí)的工作若不采用異步方式進(jìn)行處理而是直接放在主線程中處理,則會(huì)導(dǎo)致Android系統(tǒng)APP卡頓,嚴(yán)重時(shí)甚至?xí)霈F(xiàn)ANR(Application Not Responding,應(yīng)用程序無(wú)響應(yīng))的異常錯(cuò)誤。
目前,現(xiàn)有的基于Android的異步處理數(shù)據(jù)的方法一般為:每開(kāi)啟一個(gè)新的任務(wù)就會(huì)開(kāi)啟一個(gè)新的線程(線程是程序中一個(gè)單一的順序控制流程,是一個(gè)相對(duì)獨(dú)立和可調(diào)度的執(zhí)行單元,在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程),任務(wù)完成后等待系統(tǒng)回收線程。但是,當(dāng)數(shù)據(jù)異步處理任務(wù)較多時(shí),開(kāi)啟和回收多線程會(huì)降低系統(tǒng)的性能,而且上述方法無(wú)法對(duì)異步任務(wù)的執(zhí)行狀態(tài)進(jìn)行反饋;由于開(kāi)發(fā)中很多邏輯都是需要同步處理的,因此反饋異步任務(wù)的執(zhí)行狀態(tài)和處理結(jié)構(gòu)會(huì)變得尤為重要。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明解決的技術(shù)問(wèn)題為:控制多線程的運(yùn)行數(shù)量,定時(shí)檢測(cè)線程是否執(zhí)行完畢。本發(fā)明不僅能夠清晰得知數(shù)據(jù)異步處理任務(wù)的執(zhí)行狀態(tài),而且占用CPU的資源和耗費(fèi)的電能均較少,能夠保證系統(tǒng)的性能,在同步應(yīng)用場(chǎng)景中具有非常明顯的優(yōu)勢(shì)。
為達(dá)到以上目的,本發(fā)明提供的具有同步回調(diào)信息功能的數(shù)據(jù)異步處理方法,方法包括以下步驟:
S1:創(chuàng)建一個(gè)指定最大線程數(shù)量的線程池pool,為每個(gè)數(shù)據(jù)異步處理任務(wù)的線程添加優(yōu)先級(jí)后,加入pool,轉(zhuǎn)到S2;
S2:當(dāng)pool中的線程啟動(dòng)時(shí),返回當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)開(kāi)始執(zhí)行的信息;對(duì)當(dāng)前線程按照預(yù)先設(shè)置的計(jì)時(shí)周期開(kāi)始計(jì)時(shí),轉(zhuǎn)到S3;
S3:通過(guò)pool調(diào)用當(dāng)前線程開(kāi)始工作,判斷當(dāng)前線程在工作過(guò)程中,是否發(fā)生異常,若是,確定并返回發(fā)生異常時(shí)的堆棧信息;否則轉(zhuǎn)到S4;
S4:在S2中的計(jì)時(shí)周期過(guò)后,判斷當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)是否完成,若是,返回當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)完成的信息;否則在預(yù)先設(shè)置的等待周期后,重新執(zhí)行S4的判斷步驟。
本發(fā)明提供的實(shí)現(xiàn)上述方法的具有同步回調(diào)信息功能的數(shù)據(jù)異步處理模塊,包括回調(diào)接口、線程池創(chuàng)建子模塊、線程啟動(dòng)響應(yīng)子模塊、異常捕獲子模塊和線程執(zhí)行狀態(tài)確定子模塊;
線程池創(chuàng)建子模塊用于:創(chuàng)建一個(gè)指定最大線程數(shù)量的線程池pool,為每個(gè)數(shù)據(jù)異步處理任務(wù)的線程添加優(yōu)先級(jí)后,加入pool;
線程啟動(dòng)響應(yīng)子模塊用于:當(dāng)pool中的線程啟動(dòng)時(shí),調(diào)用回調(diào)接口返回當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)開(kāi)始執(zhí)行的信息;對(duì)當(dāng)前線程按照預(yù)先設(shè)置的計(jì)時(shí)周期開(kāi)始計(jì)時(shí),計(jì)時(shí)周期過(guò)后向線程執(zhí)行狀態(tài)確定子模塊發(fā)送計(jì)時(shí)完成信號(hào);
異常捕獲子模塊用于:判斷pool中的線程在工作過(guò)程中是否發(fā)生異常,若是,向線程執(zhí)行狀態(tài)確定子模塊發(fā)送異常信號(hào);否則向線程執(zhí)行狀態(tài)確定子模塊發(fā)送線程執(zhí)行狀態(tài)確定信號(hào);
線程執(zhí)行狀態(tài)確定子模塊用于:
(1)收到計(jì)時(shí)完成信號(hào)和異常信號(hào)時(shí),調(diào)用回調(diào)接口確定和返回發(fā)生異常時(shí)的堆棧信息;
(2)收到計(jì)時(shí)完成信號(hào)和線程執(zhí)行狀態(tài)確定信號(hào)時(shí),判斷線程啟動(dòng)響應(yīng)子模塊啟動(dòng)的線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)是否完成,若是,調(diào)用回調(diào)接口返回當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)完成的信息;否則在預(yù)先設(shè)置的等待周期后,重新進(jìn)行判斷工作流程。
與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)在于:
(1)與現(xiàn)有技術(shù)中每開(kāi)啟一個(gè)新的任務(wù)就會(huì)開(kāi)啟一個(gè)新的線程相比,本發(fā)明創(chuàng)建了指定最大線程數(shù)量的線程池pool(S1);pool能夠控制最大實(shí)例化線程的數(shù)量,當(dāng)外界申請(qǐng)數(shù)量超過(guò)預(yù)設(shè)的最大線程數(shù)時(shí),讓后進(jìn)來(lái)的線程先等待其他線程執(zhí)行完成,再來(lái)調(diào)度該線程進(jìn)行執(zhí)行。因此,pool能夠合理控制系統(tǒng)的最大開(kāi)銷,從而達(dá)到有效的利用資源,不會(huì)開(kāi)辟很多線程而浪費(fèi)系統(tǒng)資源的問(wèn)題(若線程無(wú)限開(kāi)辟下去,必然會(huì)導(dǎo)致體統(tǒng)運(yùn)行出現(xiàn)卡頓或者嚴(yán)重情況下出現(xiàn)死機(jī)等)。
與此同時(shí),與現(xiàn)有技術(shù)中無(wú)法對(duì)異步任務(wù)的執(zhí)行狀態(tài)進(jìn)行反饋相比,本發(fā)明在線程啟動(dòng)、發(fā)生異常和結(jié)束時(shí)均會(huì)返回相應(yīng)的信息,進(jìn)而使得外界能夠清晰得知線程對(duì)應(yīng)數(shù)據(jù)異步處理任務(wù)的執(zhí)行狀態(tài),對(duì)任務(wù)異常情況即時(shí)進(jìn)行處理。因此,本發(fā)明在同步應(yīng)用場(chǎng)景中具有非常明顯的優(yōu)勢(shì)。
(2)本發(fā)明通過(guò)定時(shí)檢測(cè)(S4中設(shè)置的等待周期)的方法確定線程是否工作完成,由于不斷快速查詢會(huì)占用CPU資源且會(huì)耗費(fèi)更多的電能,因此若相鄰兩次查詢之間設(shè)置合適時(shí)長(zhǎng)的等待周期,不僅能夠保證獲取線程的執(zhí)行狀態(tài),而且占用CPU的資源和耗費(fèi)的電能均較少。
(3)本發(fā)明的數(shù)據(jù)異步處理模塊使用單例模式(一個(gè)類有且僅有一個(gè)實(shí)例,并且自行實(shí)例化向整個(gè)系統(tǒng)提供),單例模式最大的優(yōu)點(diǎn)在于在程序的任何位置都保留一份實(shí)例,并且任何位置都能夠快速訪問(wèn)到這個(gè)單例;因此,本發(fā)明能夠在使用中顯著降低開(kāi)發(fā)者獲取實(shí)例的難度,進(jìn)而明顯提高工作效率。
附圖說(shuō)明
圖1為本發(fā)明實(shí)施例中具有同步回調(diào)信息功能的數(shù)據(jù)異步處理方法的流程圖。
具體實(shí)施方式
以下結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)說(shuō)明。
參見(jiàn)圖1所示,本發(fā)明實(shí)施例中的具有同步回調(diào)信息功能的數(shù)據(jù)異步處理方法,包括以下步驟:
S1:創(chuàng)建一個(gè)指定最大線程數(shù)量的線程池pool,為每個(gè)數(shù)據(jù)異步處理任務(wù)的線程添加優(yōu)先級(jí)后,加入pool,轉(zhuǎn)到S2。
線程池:即多線程處理形式,在處理過(guò)程中將任務(wù)線程添加至隊(duì)列,然后在創(chuàng)建線程后自動(dòng)啟動(dòng)這些任務(wù);線程池線程都是后臺(tái)線程。每個(gè)線程都使用默認(rèn)的堆棧大小,以默認(rèn)的優(yōu)先級(jí)運(yùn)行,并處于多線程單元中。
S2:當(dāng)pool中的線程啟動(dòng)時(shí),告知外界當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)開(kāi)始執(zhí)行的信息、并通過(guò)1個(gè)休眠函數(shù)Thread.sleep(50),對(duì)當(dāng)前線程按照預(yù)先設(shè)置的計(jì)時(shí)周期開(kāi)始計(jì)時(shí),轉(zhuǎn)到S3。
S3:通過(guò)pool調(diào)用當(dāng)前線程開(kāi)始工作(即處理當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)開(kāi)始執(zhí)行),判斷當(dāng)前線程在工作過(guò)程中,是否發(fā)生異常,若是,確定并告知外界發(fā)生異常時(shí)的堆棧信息,結(jié)束,否則在S2中的計(jì)時(shí)周期過(guò)后,轉(zhuǎn)到S4。
S3中確定并告知外界發(fā)生異常時(shí)的堆棧信息的具體流程為:使用try-catch代碼塊中的代碼,確定當(dāng)前線程出現(xiàn)異常時(shí)的堆棧信息、并將其封裝至Exception類中;解析Exception類中的堆棧信息后,通過(guò)接口的方式將堆棧信息通知給調(diào)用者。
S4:判斷當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)是否完成,若是,告知外界當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)完成的信息,結(jié)束;否則在預(yù)先設(shè)置的等待周期(50~200毫秒,本實(shí)施例中為50毫秒,一般為100毫秒)后,重新執(zhí)行S4。
本發(fā)明實(shí)施例中的實(shí)現(xiàn)上述方法的具有同步回調(diào)信息功能的數(shù)據(jù)異步處理模塊,該模塊為單例模式,單例模式具體的實(shí)現(xiàn)流程為:
private static volatile TaskHandler instance;
//聲明單例的實(shí)例
public static TaskHandler getInstance(){
//全局唯一獲取單例的函數(shù)
if(instance==null){
//判斷該實(shí)例是否為空
synchronized(TaskHandler.class){
//同步代碼塊
if(instance==null){
//雙重判斷是否為空
instance=new TaskHandler();
//通過(guò)new關(guān)鍵字實(shí)例化類}}}
return instance;
//將實(shí)例對(duì)象返回}
上述實(shí)現(xiàn)流程中,考慮了多線程的問(wèn)題,所以在初始化的時(shí)候加了synchronized關(guān)鍵字,synchronized關(guān)鍵字表示同步的意思,表明被synchronized括起來(lái)的部分,不能多線程操作,同一時(shí)刻只能一個(gè)線程進(jìn)行操作。這種同步機(jī)制的使用,能夠有效的避免生產(chǎn)多個(gè)單例實(shí)例出來(lái);同時(shí)使用了雙重判斷空的邏輯,能夠有效的避免多線程而導(dǎo)致的多個(gè)實(shí)例的產(chǎn)生。
在此基礎(chǔ)上,該模塊包括回調(diào)接口、線程池創(chuàng)建子模塊、線程啟動(dòng)響應(yīng)子模塊、異常捕獲子模塊和線程執(zhí)行狀態(tài)確定子模塊。
回調(diào)接口的接口設(shè)計(jì)流程為:
線程池創(chuàng)建子模塊用于:創(chuàng)建一個(gè)指定最大線程數(shù)量的線程池pool,為每個(gè)數(shù)據(jù)異步處理任務(wù)的線程添加優(yōu)先級(jí)后,加入pool。
線程啟動(dòng)響應(yīng)子模塊用于:當(dāng)pool中的線程啟動(dòng)時(shí),調(diào)用回調(diào)接口中的onStart函數(shù),告知外界當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)開(kāi)始執(zhí)行的信息;同時(shí)通過(guò)1個(gè)休眠函數(shù)Thread.sleep(50),對(duì)當(dāng)前線程按照預(yù)先設(shè)置的計(jì)時(shí)周期開(kāi)始計(jì)時(shí),計(jì)時(shí)周期過(guò)后向線程執(zhí)行狀態(tài)確定子模塊發(fā)送計(jì)時(shí)完成信號(hào)。
異常捕獲子模塊用于:判斷pool中的線程在工作過(guò)程中是否發(fā)生異常,若是,向線程執(zhí)行狀態(tài)確定子模塊發(fā)送異常信號(hào);否則向線程執(zhí)行狀態(tài)確定子模塊發(fā)送線程執(zhí)行狀態(tài)確定信號(hào)。
線程執(zhí)行狀態(tài)確定子模塊用于:
(1)收到計(jì)時(shí)完成信號(hào)和異常信號(hào)時(shí),調(diào)用回調(diào)接口中的onError函數(shù)告知外界發(fā)生異常,將異常捕獲子模塊檢測(cè)發(fā)生異常時(shí)的堆棧信息封裝至errorMsg里面(errorMsg是字符串),外界可以通過(guò)errorMsg獲取詳細(xì)的失敗原因。
(2)收到計(jì)時(shí)完成信號(hào)和線程執(zhí)行狀態(tài)確定信號(hào)時(shí),判斷線程啟動(dòng)響應(yīng)子模塊啟動(dòng)的線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)是否完成,若是,調(diào)用回調(diào)接口中的onSuccess函數(shù),告知外界當(dāng)前線程對(duì)應(yīng)的數(shù)據(jù)異步處理任務(wù)完成的信息;否則在預(yù)先設(shè)置的等待周期后,重新進(jìn)行判斷工作流程。
本發(fā)明不局限于上述實(shí)施方式,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也視為本發(fā)明的保護(hù)范圍之內(nèi)。本說(shuō)明書(shū)中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域?qū)I(yè)技術(shù)人員公知的現(xiàn)有技術(shù)。