欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種數(shù)據(jù)處理方法及裝置與流程

文檔序號:11620446閱讀:189來源:國知局
一種數(shù)據(jù)處理方法及裝置與流程

本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別是涉及一種數(shù)據(jù)處理方法及裝置。



背景技術(shù):

在java應(yīng)用程序的開發(fā)中,為了便于引用外部類作用域內(nèi)的數(shù)據(jù),常常會使用到非靜態(tài)內(nèi)部類(包括匿名內(nèi)部類),例如,在使用handler(處理機(jī))將線程任務(wù)傳遞加入消息隊(duì)列中時,或者當(dāng)需要頻繁啟動某個頁面,為了避免重復(fù)創(chuàng)建相同的數(shù)據(jù)資源,也會在用于實(shí)現(xiàn)頁面的activtiy(活動)的內(nèi)部創(chuàng)建非靜態(tài)內(nèi)部類。

java的垃圾回收機(jī)制(garbagecollection,gc)只回收沒有被引用或根集不可達(dá)的對象。在對現(xiàn)有技術(shù)的研究和實(shí)踐過程中,本發(fā)明的發(fā)明人發(fā)現(xiàn):

非靜態(tài)內(nèi)部類會隱式地持有一個外部類的對象的引用,而該外部類的對象的引用與否對實(shí)現(xiàn)非靜態(tài)內(nèi)部類的功能一般無影響,換句話而言,執(zhí)行非靜態(tài)內(nèi)部類的程序通常不需要持有該外部類的對象的引用,但由于一個內(nèi)部類為非靜態(tài)內(nèi)部類,因而導(dǎo)致該非靜態(tài)內(nèi)部類會隱式地持有外部類的對象的引用,而由于非靜態(tài)內(nèi)部類隱式地持有外部類的對象的引用,因此在非靜態(tài)內(nèi)部類的生命周期內(nèi),即使外部類的對象已經(jīng)執(zhí)行完成,但由于外部類的對象的引用始終被非靜態(tài)內(nèi)部類所持有,造成了外部類的對象不滿足gc回收條件,導(dǎo)致gc無法回收外部類的對象,而與外部類的對象相關(guān)的資源也就不會被gc回收,容易造成嚴(yán)重的內(nèi)存泄漏,從而導(dǎo)致系統(tǒng)可用的內(nèi)存越來越少,最終造成系統(tǒng)崩潰。



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

本發(fā)明實(shí)施例提供一種數(shù)據(jù)處理方法及裝置,能夠自動解決由內(nèi)部類持有外部類的對象的引用而產(chǎn)生的內(nèi)存泄漏問題,減少內(nèi)存泄漏,提高應(yīng)用程序的開發(fā)效率。

本發(fā)明實(shí)施例提供一種數(shù)據(jù)處理方法,包括:

獲取數(shù)據(jù)處理請求,所述數(shù)據(jù)處理請求指示待處理的線程任務(wù);

判斷所述線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類;

若存在所述內(nèi)部類,則解除所述內(nèi)部類對所述對象的引用,得到解除引用后的線程任務(wù);

對所述解除引用后的線程任務(wù)進(jìn)行處理。

本發(fā)明實(shí)施例還提供一種數(shù)據(jù)處理裝置,包括:

獲取模塊,用于獲取數(shù)據(jù)處理請求,所述數(shù)據(jù)處理請求指示待處理的線程任務(wù);

第一判斷模塊,用于判斷所述線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類;

解除模塊,用于若存在所述內(nèi)部類,則解除所述內(nèi)部類對所述對象的引用,得到解除引用后的線程任務(wù);

處理模塊,用于對所述解除引用后的線程任務(wù)進(jìn)行處理。

本發(fā)明實(shí)施例的數(shù)據(jù)處理方法中,在根據(jù)數(shù)據(jù)請求調(diào)用生成的線程任務(wù)后,判斷該線程任務(wù)是否存在引用了外部類的對象的內(nèi)部類,當(dāng)存在時,則解除內(nèi)部類對外部類的對象的引用,從而使得外部類的對象的引用不再被內(nèi)部類所持有,從而使得外部類的對象的回收不會受內(nèi)部類的生命周期的影響,可以使得垃圾回收機(jī)制能夠及時地將外部類的對象回收,以釋放外部類的對象的內(nèi)存空間,從而減少內(nèi)存泄漏,另外,通過本發(fā)明實(shí)施例,通過對線程任務(wù)的內(nèi)部類的引用關(guān)系進(jìn)行判斷,以根據(jù)判斷結(jié)果自動解除內(nèi)部類對外部類的對象的引用,而不需要手動解除,由此可以自動解決內(nèi)部類持有外部類的對象的引用而造成的內(nèi)存泄漏的問題,提高開發(fā)效率。

附圖說明

為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

圖1是本發(fā)明實(shí)施例提供的數(shù)據(jù)處理方法的場景示意圖;

圖2是本發(fā)明實(shí)施例提供的數(shù)據(jù)處理方法的一流程圖;

圖3是本發(fā)明實(shí)施例提供的數(shù)據(jù)處理方法的另一流程圖;

圖4是本發(fā)明實(shí)施例提供的數(shù)據(jù)處理裝置的一結(jié)構(gòu)示意圖;

圖5是本發(fā)明實(shí)施例提供的數(shù)據(jù)處理裝置的另一結(jié)構(gòu)示意圖;

圖6是本發(fā)明實(shí)施例提供的終端的結(jié)構(gòu)示意圖。

具體實(shí)施方式

下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。

在java程序中,通過垃圾回收機(jī)制(garbagecollection,gc)自動管理內(nèi)存的回收,通過gc自動檢測對象是否被引用,若檢測到對象不再被任何引用所指向,則gc會將該對象回收,也即將分配給該對象的內(nèi)存空間釋放,由此不需要開發(fā)人員手動清理內(nèi)存,使得內(nèi)存釋放更及時,提高程序運(yùn)行效率。而非靜態(tài)內(nèi)部類會隱式地持有外部類的對象的引用,導(dǎo)致外部類的對象無法被gc回收,從而造成內(nèi)存泄漏,內(nèi)存泄漏是指已經(jīng)使用完畢的內(nèi)存空間沒有得到釋放。

另外,為便于理解本發(fā)明,下面對本發(fā)明所涉及的一些關(guān)于java的類的定義做簡單介紹:

普通類是指沒有內(nèi)部類的類。

內(nèi)部類可以理解為在一個類的內(nèi)部定義另一個類,外部類則是相對于內(nèi)部類而言,例如,在java程序中,定義了一個類為a,在a類的內(nèi)部定義了另外一個類b,例如可以在a類中直接定義b類,或者在a類的方法中定義b類,等等,則a類為b類的外部類,b類為a類的內(nèi)部類。

其中,內(nèi)部類又可分為靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類,兩者的區(qū)別主要在于,靜態(tài)內(nèi)部類可以有靜態(tài)成員(方法,屬性),而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員(方法,屬性);靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)成員,而非靜態(tài)內(nèi)部類可以訪問外部類的所有成員;靜態(tài)內(nèi)部類的對象可以直接生成而不需要通過外部類的對象生成,而非靜態(tài)內(nèi)部類需要通過外部類的對象實(shí)例生成內(nèi)部類對象。非靜態(tài)內(nèi)部類例如包括成員內(nèi)部類、匿名內(nèi)部類以及局部內(nèi)部類,等等。

通過本發(fā)明,可以自動解除內(nèi)部類對外部類的對象的引用關(guān)系鏈,從而可以使得外部類的對象及時被回收,減少內(nèi)存泄漏。

本發(fā)明實(shí)施例提供一種數(shù)據(jù)處理方法及裝置。

本發(fā)明實(shí)施例中,數(shù)據(jù)處理方法可以適用于各應(yīng)用的數(shù)據(jù)處理,例如即時通訊應(yīng)用、音樂播放應(yīng)用、游戲應(yīng)用等等。數(shù)據(jù)處理裝置可以集成在終端,比如智能手機(jī)、筆記本電腦、平板電腦等,用于對應(yīng)用的數(shù)據(jù)進(jìn)行處理,其中,數(shù)據(jù)處理裝置可以配置為基于java語言環(huán)境的系統(tǒng),例如安卓(android)系統(tǒng)等,數(shù)據(jù)處理裝置中的各應(yīng)用例如為基于java語言開發(fā)的安卓應(yīng)用,在本發(fā)明實(shí)施例中,均以具有安卓系統(tǒng)的數(shù)據(jù)處理裝置為例進(jìn)行描述。

例如,如圖1所示,該數(shù)據(jù)處理裝置可以獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求指示待處理的線程任務(wù),其中,數(shù)據(jù)處理請求可以來自用戶對應(yīng)用的操作,比如,如果用戶請求查看即時通訊信息,則可以通過點(diǎn)擊打開即時通訊應(yīng)用的聊天窗口以發(fā)送查看請求,根據(jù)用戶的操作指令獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求即是指為了響應(yīng)用戶的操作指令而請求處理相關(guān)的線程任務(wù)。判斷線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類,若存在該內(nèi)部類,則解除該內(nèi)部類對外部類的對象的引用,得到解除引用后的線程任務(wù),從而對解除引用后的線程任務(wù)進(jìn)行處理,若不存在該內(nèi)部類,則可以按照線程任務(wù)的正常處理方式對線程任務(wù)進(jìn)行處理,例如直接執(zhí)行該線程任務(wù)以實(shí)現(xiàn)對用戶的操作指令的響應(yīng),或者將該線程任務(wù)加入消息列表中等待執(zhí)行。

以下分別進(jìn)行詳細(xì)說明。需說明的是,以下實(shí)施例的序號不作為對實(shí)施例優(yōu)選順序的限定。

實(shí)施例一、

本實(shí)施例將從數(shù)據(jù)處理裝置的角度進(jìn)行描述,該數(shù)據(jù)處理裝置可以集成在終端中,該終端例如可以是平板電腦、手機(jī)、筆記本電腦或電子閱讀器等等。

一種數(shù)據(jù)處理方法,包括:獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求指示處理事件,根據(jù)數(shù)據(jù)處理請求調(diào)用生成的線程任務(wù),判斷線程任務(wù)是否存在引用了外部類的對象的內(nèi)部類,若存在該內(nèi)部類,則解除內(nèi)部類對對象的引用,得到解除引用后的線程任務(wù),根據(jù)解除引用后的線程任務(wù)對處理事件進(jìn)行處理。

如圖2所示,該數(shù)據(jù)處理方法的具體流程可以如下:

步驟s201:獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求指示待處理的線程任務(wù)。

數(shù)據(jù)處理請求可以來自用戶對應(yīng)用的操作,比如,如果用戶請求查看即時通訊信息,則可以通過點(diǎn)擊打開即時通訊應(yīng)用的聊天窗口以發(fā)送查看請求,根據(jù)用戶的操作指令獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求即是指為了響應(yīng)用戶的操作指令而請求處理相關(guān)的線程任務(wù)。其中,數(shù)據(jù)處理請求攜帶線程任務(wù)的標(biāo)識,例如線程任務(wù)的類名等,以指示待處理的線程任務(wù)。線程任務(wù)為數(shù)據(jù)處理請求所請求處理的相關(guān)數(shù)據(jù),為用于實(shí)現(xiàn)特定功能或目的的程序代碼。

步驟s202:判斷線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類。

其中,可以通過多種方式判斷線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類,例如,可以根據(jù)線程任務(wù)中的內(nèi)部類的類型進(jìn)行判斷,具體而言,判斷線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類,具體包括:判斷線程任務(wù)中是否存在非靜態(tài)內(nèi)部類,當(dāng)存在非靜態(tài)內(nèi)部類,則判斷線程任務(wù)中存在引用了外部類的對象的內(nèi)部類,若不存在非靜態(tài)內(nèi)部類,則判斷線程任務(wù)中不存在引用了外部類的對象的內(nèi)部類。

非靜態(tài)內(nèi)部類會隱式地持有外部類的對象的引用,因此通過判斷內(nèi)部類的類型可以判斷線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類。

或者,還可以通過獲取線程任務(wù)中各成員(類)的引用關(guān)系判斷線程任務(wù)是否存在引用了外部類的對象的內(nèi)部類,例如,獲取線程任務(wù)各成員的引用對象,判斷該對象是否為外部類的對象,當(dāng)判斷該對象為外部類的對象,則判判斷線程任務(wù)中存在引用了外部類的對象的內(nèi)部類,否則判斷為不存在。

步驟s203:若存在引用了外部類的對象的內(nèi)部類,則解除內(nèi)部類對外部類的對象的引用,得到解除引用后的線程任務(wù)。

其中解除引用后的線程任務(wù)是指解除內(nèi)部類對外部類的對象的引用后的線程任務(wù),可以通過多種方式解除內(nèi)部類(非靜態(tài)內(nèi)部類)對外部類的對象的引用,為便于描述,下文中,將引用了外部類的對象的內(nèi)部類描述為非靜態(tài)內(nèi)部類。

例如,在一種方式中,具體的步驟包括:獲取非靜態(tài)內(nèi)部類中指向外部類的對象的引用變量,將引用變量的值置為空,從而得到解除引用后的線程任務(wù)。其中,該引用變量即是內(nèi)部類中引用了外部類的對象的變量,在本實(shí)施例中,通過反射的方式獲取該引用變量。反射的方式是指java中的反射機(jī)制,通過該反射機(jī)制可以在應(yīng)用的運(yùn)行狀態(tài)中,對于任意一個類,都能夠獲取這個類的所有屬性和方法。因此,通過反射的方式可以獲取內(nèi)部類中指向外部類的對象的引用變量。

通過將該引用變量的值置為空,即意味著該引用變量不再指向外部類的對象,從而可以解除非靜態(tài)內(nèi)部類對外部類的對象的引用,而由于非靜態(tài)內(nèi)部類所實(shí)現(xiàn)的功能(也即執(zhí)行非靜態(tài)內(nèi)部類的程序的過程)通常不需要依賴外部類的對象的引用,因此即使解除非靜態(tài)內(nèi)部類和外部類的對象之間的引用關(guān)系,也不會影響非靜態(tài)內(nèi)部類功能的實(shí)現(xiàn)。

又如,在另一種方式中,還可以通過將非靜態(tài)內(nèi)部類設(shè)為靜態(tài)內(nèi)部類的方式解除內(nèi)部類對外部類的對象的引用,具體而言,若線程任務(wù)中存在非靜態(tài)內(nèi)部類,則根據(jù)預(yù)設(shè)策略將非靜態(tài)內(nèi)部類修改為靜態(tài)內(nèi)部類,由于靜態(tài)內(nèi)部類不持有對外部類的對象的引用,由此可以解除內(nèi)部類對外部類的對象的引用。

步驟s204:對解除引用后的線程任務(wù)進(jìn)行處理。

其中,對解除引用后的線程任務(wù)的處理例如可以包括將解除引用后的線程任務(wù)加入主線程的消息隊(duì)列中以等待主線程執(zhí)行,或者直接調(diào)用主線程執(zhí)行解除引用后的線程任務(wù),其中可以根據(jù)線程任務(wù)的類型或者線程任務(wù)的執(zhí)行主體確定對解除引用后的線程任務(wù)的處理方式,例如若線程任務(wù)為handler傳遞的具有匿名內(nèi)部類的runnable(多線程接口)任務(wù),則將處理后的runnable任務(wù)加入主線程的消息隊(duì)列中,若線程任務(wù)為主線程執(zhí)行的任務(wù),則可以直接調(diào)用主線程執(zhí)行解除引用后的線程任務(wù)。

其中,在步驟s202中,若判斷線程任務(wù)中不存在引用了外部類的對象的內(nèi)部類,則將線程任務(wù)加入消息隊(duì)列中以等待主線程處理,或者直接調(diào)用主線程執(zhí)行該線程任務(wù)。

本實(shí)施例中,當(dāng)判斷線程任務(wù)中存在引用了外部類的對象的內(nèi)部類,則解除內(nèi)部類對外部類的對象的引用,由此可以使得外部類的對象的回收不受內(nèi)部類的生命周期的影響,使得垃圾回收機(jī)制能夠及時地將外部類的對象回收,以釋放更多內(nèi)存,從而減少內(nèi)存泄漏,降低系統(tǒng)因內(nèi)存不足而崩潰的幾率。另外,本實(shí)施例中,通過對線程任務(wù)的內(nèi)部類的引用關(guān)系進(jìn)行自動檢測,以根據(jù)檢測結(jié)果自動解除內(nèi)部類對外部類的對象的引用,從而可以自動解決因內(nèi)部類持有外部類的對象的引用而導(dǎo)致內(nèi)存泄漏的問題,無需開發(fā)人員手動修改程序代碼,可以降低應(yīng)用的開發(fā)成本,提高應(yīng)用的開發(fā)效率。

實(shí)施例二

根據(jù)實(shí)施例一所描述的方法,以下將舉例做進(jìn)一步說明。

本實(shí)施例中,以解決具有匿名內(nèi)部類的runnable任務(wù)而造成的內(nèi)存泄漏為例進(jìn)行描述。

在java的handler(處理機(jī))機(jī)制中,當(dāng)需要實(shí)現(xiàn)多線程時,常常會利用handler將runnable接口添加到主線程的消息隊(duì)列中,以等待主線程執(zhí)行,從而實(shí)現(xiàn)多線程。開發(fā)人員在開發(fā)應(yīng)用的時候,一般通過以下方式向主線程的消息隊(duì)列添加一個runnable接口:

handler.post(newrunnable());

其中,上面的代碼表明向主線程的消息隊(duì)列添加一個具有匿名內(nèi)部類的runnable任務(wù),其中“new”表明將runnable接口定義為匿名內(nèi)部類,即該runnable任務(wù)中存在匿名內(nèi)部類,匿名內(nèi)部類會隱式地持有外部類的對象的引用。若應(yīng)用在運(yùn)行過程中,直接執(zhí)行該runnable任務(wù),則將導(dǎo)致外部類的對象無法被垃圾回收機(jī)制及時回收,造成內(nèi)存泄漏。通過本實(shí)施例,可以自動解決由于匿名內(nèi)部類的runnable任務(wù)持有外部類的對象的引用而造成的內(nèi)存泄漏問題,無需開發(fā)人員手動修改代碼。

參閱圖3,本發(fā)明實(shí)施例的數(shù)據(jù)處理方法具體包括以下步驟:

步驟s301:獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求指示待處理的線程任務(wù)。

步驟s302:判斷線程任務(wù)是否為具有匿名內(nèi)部類的runnable任務(wù),以判斷線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類。

其中,若線程任務(wù)為具有匿名內(nèi)部類的runnable任務(wù),則判斷為線程任務(wù)中存在引用了外部類的對象的內(nèi)部類,否則判斷為不存在。

步驟s303:若線程任務(wù)為具有匿名內(nèi)部類的runnable任務(wù),則獲取匿名內(nèi)部類中指向外部類的對象的引用變量,并將引用變量置為空,得到解除引用后的runnable任務(wù),并且生成預(yù)定義類,將解除引用后的runnable任務(wù)封裝為預(yù)定義類的對象,預(yù)定義類的引用類型為弱引用、軟引用或虛引用。

在本實(shí)施例中,預(yù)定義類的引用類型為弱引用,當(dāng)線程任務(wù)為具有匿名內(nèi)部類的runnable任務(wù),則通過預(yù)定義類對解除引用后的runnable任務(wù)進(jìn)行封裝,將runnable任務(wù)封裝為預(yù)定義類的對象,具體如下:

classjobextendsweakreference<object>implementsrunnable{

publicrunnablemjob;

}

其中,上述代碼中,生成的預(yù)定義類為job類,job類繼承了弱引用類weakreference,從而job類對其對象的引用為弱引用,通過將runnable任務(wù)封裝在job類中,以實(shí)現(xiàn)多線程的runnable接口。

此外,當(dāng)線程任務(wù)為具有匿名內(nèi)部類的runnable任務(wù),則判斷線程任務(wù)中存在引用了外部類的對象的內(nèi)部類,該內(nèi)部類即為匿名內(nèi)部類,以上述例子來說,runnable接口(即“runnable()”)被定義為匿名內(nèi)部類,換句話而言,runnable接口持有對外部類的對象的引用,通過獲取runnable接口中指向外部類的對象的引用變量,并將該引用變量的值置為空,從而解除匿名內(nèi)部類的runnable接口對外部類的對象的引用關(guān)系。

其中,獲取匿名內(nèi)部類中指向外部類的對象的引用變量,并將該引用變量的值置為空的步驟,可以和上述runnable任務(wù)的封裝步驟同時進(jìn)行,也可以是先后進(jìn)行,先后的順序可以根據(jù)需要進(jìn)行設(shè)置,例如當(dāng)判斷線程任務(wù)為具有匿名內(nèi)部類的runnable任務(wù),則可以在解除runnable任務(wù)的匿名內(nèi)部類和外部類的引用關(guān)系的同時,將runnable任務(wù)進(jìn)行封裝,或者可以在解除引用關(guān)系后將接觸引用關(guān)系的runnable任務(wù)進(jìn)行封裝,或者將runnable封裝之后再解除引用關(guān)系。

通過將匿名內(nèi)部類中指向外部類的對象的引用變量的值置為空,可以解除runnable任務(wù)與外部類之間的引用關(guān)系,從而使得垃圾回收機(jī)制能夠及時回收外部類的對象。

其中,當(dāng)線程任務(wù)不是具有匿名內(nèi)部類的runnable任務(wù),則將線程任務(wù)直接添加到主線程的消息隊(duì)列中,以等待主線程從消息隊(duì)列中取出該線程任務(wù)并做相應(yīng)處理,例如主線程直接執(zhí)行該線程任務(wù)或者發(fā)給其他線程執(zhí)行該線程任務(wù)。

步驟s304:將封裝后的runnable任務(wù)添加到主線程的消息隊(duì)列中,以處理封裝后的runnable任務(wù)。

消息隊(duì)列用于存放等待主線程處理的消息或任務(wù)。

步驟s305:調(diào)用主線程從消息隊(duì)列中讀取封裝后的runnable任務(wù),并根據(jù)預(yù)定義類的引用類型,判斷預(yù)定義類的對象是否被回收,若預(yù)定義類的對象沒有被回收,則使用主線程對封裝后的runnable任務(wù)進(jìn)行處理。

其中,使主線程對處理后的runnable任務(wù)進(jìn)行處理例如包括使用主線程執(zhí)行封裝后的runnable任務(wù),或者將封裝后的runnable任務(wù)發(fā)送給其他線程執(zhí)行。其中使用主線程對封裝后的runnable任務(wù)進(jìn)行處理具體是指使用主線程執(zhí)行封裝在job類中的runnable任務(wù)。

本實(shí)施例中,由于job類的引用類型為弱引用,因此在沒有其他強(qiáng)引用的情況下,一旦被垃圾回收機(jī)制檢測,則job類的對象將會被垃圾回收機(jī)制回收。本實(shí)施例中,通過job類的弱引用,判斷job類的對象是否被回收。由于runnable任務(wù)整個作為job類的對象封裝在job類中,因此當(dāng)job類的對象被回收,則無需再對runnable任務(wù)進(jìn)行處理,若job類的對象沒有被回收,則使用主線程執(zhí)行封裝在job類中的runnable任務(wù)。

其中,當(dāng)job類的引用類型為軟引用或虛引用時,則根據(jù)軟引用或虛引用的引用類型判斷job類的對象是否被回收。

本實(shí)施例,不僅能夠自動解除runnable任務(wù)中的匿名內(nèi)部類與外部類之間的引用,以減少內(nèi)存泄漏,且通過預(yù)定義的job類,并將該job類設(shè)置為繼承弱引用類,由此根據(jù)弱引用類可以自動判斷job類的對象是否被回收,以決定是否需要執(zhí)行runnable任務(wù)。

實(shí)施例三、

為了更好地實(shí)施上述方法,本發(fā)明實(shí)施例還提供一種數(shù)據(jù)處理裝置,該數(shù)據(jù)處理裝置具體可以集成在終端中,比如智能手機(jī)、平板電腦等。

如圖4所示,本實(shí)施例的數(shù)據(jù)處理裝置包括獲取模塊401、第一判斷模塊402、解除模塊403以及處理模塊404。

其中,獲取模塊401用于獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求指示待處理的線程任務(wù)。

數(shù)據(jù)處理請求可以來自用戶對應(yīng)用的操作,比如,如果用戶請求查看即時通訊信息,則可以通過點(diǎn)擊打開即時通訊應(yīng)用的聊天窗口以發(fā)送查看請求,根據(jù)用戶的操作指令獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求即是指為了響應(yīng)用戶的操作指令而請求處理相關(guān)的線程任務(wù)。其中,數(shù)據(jù)處理請求攜帶線程任務(wù)的標(biāo)識,例如線程任務(wù)的類名等,以指示待處理的線程任務(wù)。線程任務(wù)為數(shù)據(jù)處理請求所請求處理的相關(guān)數(shù)據(jù),為用于實(shí)現(xiàn)特定功能或目的的程序代碼。

第一判斷模塊402用于判斷線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類。

本實(shí)施例中,根據(jù)線程任務(wù)中的內(nèi)部類的類型進(jìn)行判斷。具體而言,第一判斷模塊402具體用于判斷線程任務(wù)中是否存在非靜態(tài)內(nèi)部類,當(dāng)存在非靜態(tài)內(nèi)部類,則判斷線程任務(wù)中存在引用了外部類的對象的內(nèi)部類,若不存在非靜態(tài)內(nèi)部類,則判斷線程任務(wù)中不存在引用了外部類的對象的內(nèi)部類。

非靜態(tài)內(nèi)部類會隱式地持有外部類的對象的引用,因此通過判斷內(nèi)部類的類型可以判斷線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類。

解除模塊403用于若線程任務(wù)中存在引用了外部類的對象的內(nèi)部類,則解除內(nèi)部類對外部類的對象的引用,得到解除引用后的線程任務(wù)。

其中,可以通過多種方式解除內(nèi)部類(非靜態(tài)內(nèi)部類)對外部類的對象的引用,為便于描述,下文中,將引用了外部類的對象的內(nèi)部類描述為非靜態(tài)內(nèi)部類。

例如,在一種方式中,解除模塊403具體用于獲取非靜態(tài)內(nèi)部類中指向外部類的對象的引用變量,并將引用變量的值置為空,從而得到解除引用后的線程任務(wù)。其中,該引用變量即是內(nèi)部類中引用了外部類的對象的變量,在本實(shí)施例中,通過反射的方式獲取該引用變量。反射的方式是指java中的反射機(jī)制,通過該反射機(jī)制可以在應(yīng)用的運(yùn)行狀態(tài)中,對于任意一個類,都能夠獲取這個類的所有屬性和方法。因此,通過反射的方式可以獲取內(nèi)部類中指向外部類的對象的引用變量。

通過將該引用變量的值置為空,即意味著該引用變量不再指向外部類的對象,從而可以解除非靜態(tài)內(nèi)部類對外部類的對象的引用。

處理模塊404用于對解除引用后的線程任務(wù)進(jìn)行處理。

其中,對解除引用后的線程任務(wù)的處理包括將線程任務(wù)加入主線程的消息隊(duì)列中以等待主線程執(zhí)行,或者直接調(diào)用主線程執(zhí)行解除引用后的線程任務(wù),其中可以根據(jù)線程任務(wù)的類型或者線程任務(wù)的執(zhí)行主體確定對解除引用后的線程任務(wù)的處理方式,例如若線程任務(wù)為handler傳遞的具有匿名內(nèi)部類的runnable(多線程接口)任務(wù),則將處理后的runnable任務(wù)加入主線程的消息隊(duì)列中,若線程任務(wù)為主線程執(zhí)行的任務(wù),則直接調(diào)用主線程執(zhí)行解除引用后的線程任務(wù)。

其中,若第一判斷模塊402判斷線程任務(wù)中不存在引用了外部類的對象的內(nèi)部類,則處理模塊404還用于將線程任務(wù)加入消息隊(duì)列中以等待主線程處理,或者直接調(diào)用主線程執(zhí)行該線程任務(wù)。

本實(shí)施例中,當(dāng)判斷線程任務(wù)中存在引用了外部類的對象的內(nèi)部類,則解除內(nèi)部類對外部類的對象的引用,由此可以使得外部類的對象的回收不受內(nèi)部類的生命周期的影響,使得垃圾回收機(jī)制能夠及時地將外部類的對象回收,以釋放更多內(nèi)存,從而減少內(nèi)存泄漏,降低系統(tǒng)因內(nèi)存不足而崩潰的幾率。另外,本實(shí)施例中,通過對線程任務(wù)的內(nèi)部類的引用關(guān)系進(jìn)行自動檢測,以根據(jù)檢測結(jié)果自動解除內(nèi)部類對外部類的對象的引用,從而可以自動解決因內(nèi)部類持有外部類的對象的引用而導(dǎo)致內(nèi)存泄漏的問題,無需開發(fā)人員手動修改程序代碼,可以應(yīng)用的開發(fā)成本,提高應(yīng)用的開發(fā)效率。

實(shí)施例四、

根據(jù)上述實(shí)施例三所描述的數(shù)據(jù)處理裝置,以下將舉例做進(jìn)一步描述。

本實(shí)施例的該數(shù)據(jù)處理裝置具體可以集成在終端中,比如智能手機(jī)、平板電腦等。

如圖5所示,其中圖5和圖4中相同標(biāo)號的元件作用相同,本實(shí)施例中,數(shù)據(jù)處理裝置進(jìn)一步還包括封裝模塊501、調(diào)用模塊502以及第二處理模塊503。

本實(shí)施例中,線程任務(wù)例如為需要通過handle發(fā)送至主線程的消息隊(duì)列中的線程任務(wù)。其中,封裝模塊501用于當(dāng)線程任務(wù)中存在引用了外部類的對象的內(nèi)部類時,生成預(yù)定義類,并將解除引用后的線程任務(wù)封裝為預(yù)定義類的對象。該預(yù)定義類的引用類型可以是弱引用、軟引用或虛引用。

處理模塊404具體用于將封裝后的線程任務(wù)加入主線程的消息隊(duì)列中,以對封裝后的線程任務(wù)進(jìn)行處理。

其中,調(diào)用模塊502用于調(diào)用主線程從消息隊(duì)列中讀取封裝后的線程任務(wù)。

第二處理模塊503用于根據(jù)預(yù)定義類的引用類型,判斷預(yù)定義類的對象是否被回收,若預(yù)定義類的對象沒有被回收,則使用主線程對封裝后的線程任務(wù)進(jìn)行處理。其中,若預(yù)定義類的對象已被回收,則無需再對封裝后的線程任務(wù)進(jìn)行處理。

通過本實(shí)施例,可以自動判斷預(yù)定義類的對象是否被回收,進(jìn)而決定是否需要執(zhí)行線程任務(wù)。

實(shí)施例五、

相應(yīng)的,本發(fā)明實(shí)施例還提供一種終端,如圖6所示,該終端可以包括射頻(rf,radiofrequency)電路601、包括有一個或一個以上計(jì)算機(jī)可讀存儲介質(zhì)的存儲器602、輸入單元603、顯示單元604、傳感器605、音頻電路606、無線保真(wifi,wirelessfidelity)模塊607、包括有一個或者一個以上處理核心的處理器608、以及電源609等部件。本領(lǐng)域技術(shù)人員可以理解,圖6中示出的終端結(jié)構(gòu)并不構(gòu)成對終端的限定,可以包括比圖示更多或更少的部件,或者組合某些部件,或者不同的部件布置。其中:

rf電路601可用于收發(fā)信息或通話過程中,信號的接收和發(fā)送,特別地,將基站的下行信息接收后,交由一個或者一個以上處理器608處理;另外,將涉及上行的數(shù)據(jù)發(fā)送給基站。通常,rf電路601包括但不限于天線、至少一個放大器、調(diào)諧器、一個或多個振蕩器、用戶身份模塊(sim,subscriberidentitymodule)卡、收發(fā)信機(jī)、耦合器、低噪聲放大器(lna,lownoiseamplifier)、雙工器等。此外,rf電路601還可以通過無線通信與網(wǎng)絡(luò)和其他設(shè)備通信。所述無線通信可以使用任一通信標(biāo)準(zhǔn)或協(xié)議,包括但不限于全球移動通訊系統(tǒng)(gsm,globalsystemofmobilecommunication)、通用分組無線服務(wù)(gprs,generalpacketradioservice)、碼分多址(cdma,codedivisionmultipleaccess)、寬帶碼分多址(wcdma,widebandcodedivisionmultipleaccess)、長期演進(jìn)(lte,longtermevolution)、電子郵件、短消息服務(wù)(sms,shortmessagingservice)等。

存儲器602可用于存儲軟件程序以及模塊,處理器608通過運(yùn)行存儲在存儲器602的軟件程序以及模塊,從而執(zhí)行各種功能應(yīng)用以及數(shù)據(jù)處理。存儲器602可主要包括存儲程序區(qū)和存儲數(shù)據(jù)區(qū),其中,存儲程序區(qū)可存儲操作系統(tǒng)、至少一個功能所需的應(yīng)用程序(比如聲音播放功能、圖像播放功能等)等;存儲數(shù)據(jù)區(qū)可存儲根據(jù)終端的使用所創(chuàng)建的數(shù)據(jù)(比如音頻數(shù)據(jù)、電話本等)等。此外,存儲器602可以包括高速隨機(jī)存取存儲器,還可以包括非易失性存儲器,例如至少一個磁盤存儲器件、閃存器件、或其他易失性固態(tài)存儲器件。相應(yīng)地,存儲器602還可以包括存儲器控制器,以提供處理器608和輸入單元603對存儲器602的訪問。

輸入單元603可用于接收輸入的數(shù)字或字符信息,以及產(chǎn)生與用戶設(shè)置以及功能控制有關(guān)的鍵盤、鼠標(biāo)、操作桿、光學(xué)或者軌跡球信號輸入。具體地,在一個具體的實(shí)施例中,輸入單元603可包括觸敏表面以及其他輸入設(shè)備。觸敏表面,也稱為觸摸顯示屏或者觸控板,可收集用戶在其上或附近的觸摸操作(比如用戶使用手指、觸筆等任何適合的物體或附件在觸敏表面上或在觸敏表面附近的操作),并根據(jù)預(yù)先設(shè)定的程式驅(qū)動相應(yīng)的連接裝置??蛇x的,觸敏表面可包括觸摸檢測裝置和觸摸控制器兩個部分。其中,觸摸檢測裝置檢測用戶的觸摸方位,并檢測觸摸操作帶來的信號,將信號傳送給觸摸控制器;觸摸控制器從觸摸檢測裝置上接收觸摸信息,并將它轉(zhuǎn)換成觸點(diǎn)坐標(biāo),再送給處理器608,并能接收處理器608發(fā)來的命令并加以執(zhí)行。此外,可以采用電阻式、電容式、紅外線以及表面聲波等多種類型實(shí)現(xiàn)觸敏表面。除了觸敏表面,輸入單元603還可以包括其他輸入設(shè)備。具體地,其他輸入設(shè)備可以包括但不限于物理鍵盤、功能鍵(比如音量控制按鍵、開關(guān)按鍵等)、軌跡球、鼠標(biāo)、操作桿等中的一種或多種。

顯示單元604可用于顯示由用戶輸入的信息或提供給用戶的信息以及終端的各種圖形用戶接口,這些圖形用戶接口可以由圖形、文本、圖標(biāo)、視頻和其任意組合來構(gòu)成。顯示單元604可包括顯示面板,可選的,可以采用液晶顯示器(lcd,liquidcrystaldisplay)、有機(jī)發(fā)光二極管(oled,organiclight-emittingdiode)等形式來配置顯示面板。進(jìn)一步的,觸敏表面可覆蓋顯示面板,當(dāng)觸敏表面檢測到在其上或附近的觸摸操作后,傳送給處理器608以確定觸摸事件的類型,隨后處理器608根據(jù)觸摸事件的類型在顯示面板上提供相應(yīng)的視覺輸出。雖然在圖6中,觸敏表面與顯示面板是作為兩個獨(dú)立的部件來實(shí)現(xiàn)輸入和輸入功能,但是在某些實(shí)施例中,可以將觸敏表面與顯示面板集成而實(shí)現(xiàn)輸入和輸出功能。

終端還可包括至少一種傳感器605,比如光傳感器、運(yùn)動傳感器以及其他傳感器。具體地,光傳感器可包括環(huán)境光傳感器及接近傳感器,其中,環(huán)境光傳感器可根據(jù)環(huán)境光線的明暗來調(diào)節(jié)顯示面板的亮度,接近傳感器可在終端移動到耳邊時,關(guān)閉顯示面板和/或背光。作為運(yùn)動傳感器的一種,重力加速度傳感器可檢測各個方向上(一般為三軸)加速度的大小,靜止時可檢測出重力的大小及方向,可用于識別手機(jī)姿態(tài)的應(yīng)用(比如橫豎屏切換、相關(guān)游戲、磁力計(jì)姿態(tài)校準(zhǔn))、振動識別相關(guān)功能(比如計(jì)步器、敲擊)等;至于終端還可配置的陀螺儀、氣壓計(jì)、濕度計(jì)、溫度計(jì)、紅外線傳感器等其他傳感器,在此不再贅述。

音頻電路606、揚(yáng)聲器,傳聲器可提供用戶與終端之間的音頻接口。音頻電路606可將接收到的音頻數(shù)據(jù)轉(zhuǎn)換后的電信號,傳輸?shù)綋P(yáng)聲器,由揚(yáng)聲器轉(zhuǎn)換為聲音信號輸出;另一方面,傳聲器將收集的聲音信號轉(zhuǎn)換為電信號,由音頻電路606接收后轉(zhuǎn)換為音頻數(shù)據(jù),再將音頻數(shù)據(jù)輸出處理器608處理后,經(jīng)rf電路601以發(fā)送給比如另一終端,或者將音頻數(shù)據(jù)輸出至存儲器602以便進(jìn)一步處理。音頻電路606還可能包括耳塞插孔,以提供外設(shè)耳機(jī)與終端的通信。

wifi屬于短距離無線傳輸技術(shù),終端通過wifi模塊607可以幫助用戶收發(fā)電子郵件、瀏覽網(wǎng)頁和訪問流式媒體等,它為用戶提供了無線的寬帶互聯(lián)網(wǎng)訪問。雖然圖6示出了wifi模塊607,但是可以理解的是,其并不屬于終端的必須構(gòu)成,完全可以根據(jù)需要在不改變發(fā)明的本質(zhì)的范圍內(nèi)而省略。

處理器608是終端的控制中心,利用各種接口和線路連接整個手機(jī)的各個部分,通過運(yùn)行或執(zhí)行存儲在存儲器602內(nèi)的軟件程序和/或模塊,以及調(diào)用存儲在存儲器602內(nèi)的數(shù)據(jù),執(zhí)行終端的各種功能和處理數(shù)據(jù),從而對手機(jī)進(jìn)行整體監(jiān)控。可選的,處理器608可包括一個或多個處理核心;優(yōu)選的,處理器608可集成應(yīng)用處理器和調(diào)制解調(diào)處理器,其中,應(yīng)用處理器主要處理操作系統(tǒng)、用戶界面和應(yīng)用程序等,調(diào)制解調(diào)處理器主要處理無線通信??梢岳斫獾氖牵鲜稣{(diào)制解調(diào)處理器也可以不集成到處理器608中。

終端還包括給各個部件供電的電源609(比如電池),優(yōu)選的,電源可以通過電源管理系統(tǒng)與處理器608邏輯相連,從而通過電源管理系統(tǒng)實(shí)現(xiàn)管理充電、放電、以及功耗管理等功能。電源609還可以包括一個或一個以上的直流或交流電源、再充電系統(tǒng)、電源故障檢測電路、電源轉(zhuǎn)換器或者逆變器、電源狀態(tài)指示器等任意組件。

盡管未示出,終端還可以包括攝像頭、藍(lán)牙模塊等,在此不再贅述。具體在本實(shí)施例中,終端中的處理器608會按照如下的指令,將一個或一個以上的應(yīng)用程序的進(jìn)程對應(yīng)的可執(zhí)行文件加載到存儲器602中,并由處理器608來運(yùn)行存儲在存儲器602中的應(yīng)用程序,從而實(shí)現(xiàn)各種功能:

獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求指示待處理的線程任務(wù),其中,數(shù)據(jù)處理請求可以來自用戶對應(yīng)用的操作,比如,如果用戶請求查看即時通訊信息,則可以通過點(diǎn)擊打開即時通訊應(yīng)用的聊天窗口以發(fā)送查看請求,根據(jù)用戶的操作指令獲取數(shù)據(jù)處理請求,數(shù)據(jù)處理請求即是指為了響應(yīng)用戶的操作指令而請求處理相關(guān)的線程任務(wù)。

判斷線程任務(wù)中是否存在引用了外部類的對象的內(nèi)部類,若存在該內(nèi)部類,則解除該內(nèi)部類對外部類的對象的引用,得到解除引用后的線程任務(wù),從而對解除引用后的線程任務(wù)進(jìn)行處理。

其中,可以通過獲取內(nèi)部類中指向外部類的對象的引用變量,并將該引用變量的值置為空,從而解除內(nèi)部類對外部類的對象的引用。進(jìn)一步地,可以通過通過反射的方式獲取內(nèi)部類中指向外部類的對象的引用變量。

以上各個操作的具體實(shí)施可參見前面的實(shí)施例,在此不再贅述。

由上可知,當(dāng)判斷線程任務(wù)中存在引用了外部類的對象的內(nèi)部類,則解除內(nèi)部類對外部類的對象的引用,由此可以使得外部類的對象的回收不受內(nèi)部類的生命周期的影響,使得垃圾回收機(jī)制能夠及時地將外部類的對象回收,以釋放更多內(nèi)存,從而減少內(nèi)存泄漏,降低系統(tǒng)因內(nèi)存不足而崩潰的幾率。

本領(lǐng)域普通技術(shù)人員可以理解上述實(shí)施例的各種方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,該程序可以存儲于一計(jì)算機(jī)可讀存儲介質(zhì)中,存儲介質(zhì)可以包括:只讀存儲器(rom,readonlymemory)、隨機(jī)存取記憶體(ram,randomaccessmemory)、磁盤或光盤等。

以上對本發(fā)明實(shí)施例所提供的一種瀏覽器頁面數(shù)據(jù)過濾方法、裝置和系統(tǒng)進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
沧州市| 新郑市| 汉中市| 耒阳市| 元朗区| 永清县| 叙永县| 友谊县| 和政县| 咸丰县| 洞口县| 大冶市| 玉林市| 乌恰县| 体育| 江都市| 廉江市| 汽车| 敦化市| 济南市| 徐汇区| 兴化市| 贺兰县| 时尚| 沙坪坝区| 泰安市| 霍邱县| 榕江县| 通河县| 涟源市| 郓城县| 舞钢市| 英山县| 民权县| 衡阳市| 沂源县| 平果县| 阜康市| 沈阳市| 高要市| 潞西市|