本發(fā)明涉及APP界面啟動技術領域,更具體地說,涉及一種數(shù)據(jù)延遲加載方法及裝置。
背景技術:
Android App的啟動和界面的啟動,一般會伴隨著View的初始化和數(shù)據(jù)的獲取。
但是,當界面所涉及的數(shù)據(jù)量對App來說相對較大時,界面在啟動的過程中花費的時間就相對較久,這個時間就會直接體現(xiàn)在界面的啟動速度之上,導致界面的啟動速度較慢。
因此,現(xiàn)有技術中存在如果App界面所涉及的數(shù)據(jù)量較大會導致該界面的啟動速度較慢的問題。
技術實現(xiàn)要素:
本發(fā)明的目的是提供一種數(shù)據(jù)延遲加載方法及裝置,以解決現(xiàn)有技術中存在的如果App界面所涉及的數(shù)據(jù)量較大會導致該界面的啟動速度較慢的問題。
為了實現(xiàn)上述目的,本發(fā)明提供如下技術方案:
一種數(shù)據(jù)延遲加載方法,包括:
將放置消息放置到View消息隊列的最后,所述放置消息包含有數(shù)據(jù)加載消息;
執(zhí)行所述放置消息,以將所述數(shù)據(jù)加載消息放置到主線程消息隊列的最后。
優(yōu)選的,將放置消息放置到View消息隊列的最后,包括:
利用DecorView的Post()方法將所述放置消息放置到View消息隊列的最后。
優(yōu)選的,執(zhí)行所述放置消息,包括:
在perform Traversals()方法中執(zhí)行所述放置消息。
優(yōu)選的,將所述數(shù)據(jù)加載消息放置到主線程消息隊列的最后之后,還包括:
在所述數(shù)據(jù)加載消息之后放置預設回調(diào)函數(shù)。
一種數(shù)據(jù)延遲加載裝置,包括:
第一放置模塊,用于將放置消息放置到View消息隊列的最后,所述放置消息包含有數(shù)據(jù)加載消息;
執(zhí)行模塊,用于執(zhí)行所述放置消息,以將所述數(shù)據(jù)加載消息放置到主線程消息隊列的最后。
優(yōu)選的,所述第一放置模塊包括:
放置單元,用于利用DecorView的Post()方法將所述放置消息放置到View消息隊列的最后。
優(yōu)選的,所述執(zhí)行模塊包括:
執(zhí)行單元,用于在perform Traversals()方法中執(zhí)行所述放置消息。
優(yōu)選的,還包括:
第二放置模塊,用于在所述數(shù)據(jù)加載消息之后放置預設回調(diào)函數(shù)。
本發(fā)明提供的一種數(shù)據(jù)延遲加載方法及裝置,其中,該方法包括:將放置消息放置到View消息隊列的最后,所述放置消息包含有數(shù)據(jù)加載消息;執(zhí)行所述放置消息,以將所述數(shù)據(jù)加載消息放置到主線程消息隊列的最后。與現(xiàn)有技術相比,本申請中通過上述步驟將數(shù)據(jù)加載消息放置到主線程消息隊列的最后,而主線程消息隊列中包含的其他消息包括View初始化消息,由此,可以在主線程中包含的View初始化消息執(zhí)行完成后,即對應App界面啟動完成后再執(zhí)行數(shù)據(jù)加載消息,加載該App界面所需加載的數(shù)據(jù),從而避免了數(shù)據(jù)加載對App界面啟動的影響,提高了App界面的啟動速度。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術中的技術方案,下面將對實施例或現(xiàn)有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1為本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載方法的流程圖;
圖2為本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載方法中在Android開發(fā)中具有的界面渲染回調(diào)示意圖;
圖3為本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載裝置的結(jié)構示意圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
請參閱圖1,其示出了本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載方法的流程圖,可以包括以下步驟:
S11:將放置消息放置到View消息隊列的最后,放置消息包含有數(shù)據(jù)加載消息。
需要說明的是,View消息隊列中包含的消息即為在App界面啟動過程中所涉及的View初始化消息及數(shù)據(jù)加載消息,其中,View初始化消息即為通過執(zhí)行這些消息實現(xiàn)View的初始化,進而顯示App界面,而數(shù)據(jù)加載消息即為通過執(zhí)行該消息實現(xiàn)數(shù)據(jù)的獲取,供App使用。
通常View消息隊列中的消息需被發(fā)送至主線程消息隊列中,以使得主線程對相關消息進行執(zhí)行。通過將包含數(shù)據(jù)加載消息的放置消息放置到View消息隊列的最后,能夠保證該放置消息最后被執(zhí)行,也即使得放置消息中包含的數(shù)據(jù)加載消息被放置到主線程消息隊列的最后。
S12:執(zhí)行放置消息,以將數(shù)據(jù)加載消息放置到主線程消息隊列的最后。
放置消息即為將數(shù)據(jù)加載消息放置到主線程消息隊列最后的消息,因此,執(zhí)行放置消息的過程即為將數(shù)據(jù)加載消息放到主線程消息隊列最后的過程。由此,能夠使得數(shù)據(jù)加載消息在其他消息全部執(zhí)行完成后再執(zhí)行,也即在View初始化消息執(zhí)行完成且完成界面的啟動后再執(zhí)行,從而嚴格區(qū)分了界面的渲染和數(shù)據(jù)的加載,細化了界面的生命周期,避免了數(shù)據(jù)的加載對界面的渲染造成影響。
與現(xiàn)有技術相比,本申請中通過上述步驟將數(shù)據(jù)加載消息放置到主線程消息隊列的最后,而主線程消息隊列中包含的其他消息包括View初始化消息,由此,可以在主線程中包含的View初始化消息執(zhí)行完成后,即對應App界面啟動完成后再執(zhí)行數(shù)據(jù)加載消息,加載該App界面所需加載的數(shù)據(jù),從而避免了數(shù)據(jù)加載對App界面啟動的影響,提高了App界面的啟動速度。
需要說明的是,對于數(shù)據(jù)需要從數(shù)據(jù)庫或者配置文件抑或是從網(wǎng)絡中獲取的App界面,本發(fā)明提供的上述步驟實際上為尋找合適的數(shù)據(jù)加載點,以達到先渲染界面,再加載數(shù)據(jù)的目的。
具體來說,在Android開發(fā)中,具有如圖2所示的界面渲染回調(diào),包括onCreate()方法、onResume()方法等。在這些對界面元素的生命周期的回調(diào)中,可以實現(xiàn)數(shù)據(jù)的加載,進而實現(xiàn)界面和數(shù)據(jù)的初始化,完成界面的啟動。但是,在onCreate()方法中進行數(shù)據(jù)的加載或者是異步線程的啟動都是需要消耗CPU時間的,而這部分數(shù)據(jù)加載的代碼并不會影響界面的渲染,但是卻和View初始化一起出現(xiàn)在界面渲染的過程中,進而導致界面啟動時間白白增加。
發(fā)明人發(fā)現(xiàn),在onCreate()方法等方法調(diào)用之后還存在一些沒有被聲明出來的方法被用來作為界面渲染的過程(即圖中的other funs),因此,可以選擇在這部分方法中對數(shù)據(jù)加載進行相關設置。
在Activity的onCreate()方法調(diào)用之前,會調(diào)用attach()方法,在attach()方法調(diào)用的時候會創(chuàng)建一個PhoneWindow,這個PhoneWindow中有個DecorView,這個DecorView是所有Activity最底層的一個View,類為FrameLayout,其具有View的一切特性,且會在onCreate()方法中被初始化。
Activity的onCreate()方法做了很多初始化的操作,包括PhoneWindow/DecorView/StartingView/setContentView等,但真正要設置為顯示則在Resume()的時候,不過這些對開發(fā)者是透明的,具體可以看ActivityThread的handleResumeActivity()方法,該方法包含于圖2中的other funs,這個方法中除了調(diào)用Activity的onResume()回調(diào)之外,還初始化了ViewRootImpl/ThreadedRenderer等。其中,ViewRootImpl在初始化之后,把DecorView設置為自己的root對象的值,因此得出上文中所說的DecorView是界面最底層的View的結(jié)論。
由于View在渲染的時候會維持自己所發(fā)出的一個消息隊列,即View消息隊列,但是這個消息隊列最終會被主線程的Looper所獲取并且在主線程執(zhí)行,所以,如果把數(shù)據(jù)加載消息放置到View渲染完之后,那就可以等View渲染完之后執(zhí)行這個消息。而DecorView是界面最底層的View,因此,可以將包含有數(shù)據(jù)加載消息的放置消息放置到DecorView對應的View消息隊列的最后。
其中,可以通過DecorView的post()方法將放置消息放置到View消息隊列的最后,即本身中優(yōu)選的將放置消息放置到View消息隊列的最后,可以包括:利用DecorView的Post()方法將放置消息放置到View消息隊列的最后。DecorView的post()方法可以調(diào)用自身的一個變量AttachInfo的Handler.post()方法,而AttachInfo是在ViewRootImpl中,也就是在handleResumeActivity()方法中進行初始化的,且其Handler對象的Looper是主線程的Looper。因此,由于在onCreate()方法中,DecorView初始化了,但是AttachInfo還沒初始化,所以在onCreate()方法中通過DecorView的post()方法會直接跳過AttachInfo把放置消息放置到DecorView的View消息隊列的最后。
本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載方法中,執(zhí)行放置消息,可以包括:
在perform Traversals()方法中執(zhí)行放置消息。
View消息隊列中的消息可以在ViewRootImpl的performTraversals()方法被執(zhí)行,其中,performTraversals()方法其實是負責View的每一幀的繪制,所以只需要在這個方法的執(zhí)行中將數(shù)據(jù)加載消息放置到主線程消息隊列的最后,即執(zhí)行完該方法后再執(zhí)行數(shù)據(jù)加載消息,就可保證在View渲染完成之后執(zhí)行數(shù)據(jù)加載消息。
需要說明的是,在ViewRootImpl第一次執(zhí)行performTraversals()方法時,會執(zhí)行Egl的初始化邏輯,然后會重新執(zhí)行一次performTraversals()方法,因此,最終會在第二次調(diào)用該方法后執(zhí)行數(shù)據(jù)加載消息;也即,為了數(shù)據(jù)加載消息不會被第一次執(zhí)行performTraversals()方法之后被消費,可以將這個消息再次添加到View消息隊列中,通過再包裝一層Runnable的殼,達到第二次執(zhí)行performTraversal()方法后執(zhí)行數(shù)據(jù)加載消息。
本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載方法中,將數(shù)據(jù)加載消息放置到主線程消息隊列的最后之后,還可以包括:
在數(shù)據(jù)加載消息之后放置預設回調(diào)函數(shù)。
需要說明的是,這個預設回調(diào)函數(shù)可以是定義的一個接口,該接口中具有一個加載數(shù)據(jù)的方法,然后在需要延遲加載的Activity中實現(xiàn)這個接口加載數(shù)據(jù),最后在數(shù)據(jù)加載消息中調(diào)用這個函數(shù)即可。同樣也可以是需要延遲加載的Activity的一個自定義函數(shù),只要在數(shù)據(jù)加載消息中調(diào)用這個函數(shù)即可。
因為上述實施例中對這個函數(shù)進行了兩次消息投遞的包裝,而這個過程是固定不變的,所以加上這個調(diào)用過程(即加上預設回調(diào)函數(shù))之后,開發(fā)人員只需要關注在這個函數(shù)中怎么樣加載數(shù)據(jù),而不用重寫和理解這個過程,提高了開發(fā)人員的工作效率。
與上述實施例相對應,本發(fā)明實施例還提供了一種數(shù)據(jù)延遲加載裝置,如圖3所示,可以包括:
第一放置模塊11,用于將放置消息放置到View消息隊列的最后,放置消息包含有數(shù)據(jù)加載消息;
執(zhí)行模塊12,用于執(zhí)行放置消息,以將數(shù)據(jù)加載消息放置到主線程消息隊列的最后。
本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載裝置中,第一放置模塊可以包括:
放置單元,用于利用DecorView的Post()方法將放置消息放置到View消息隊列的最后。
本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載裝置中,執(zhí)行模塊可以包括:
執(zhí)行單元,用于在perform Traversals()方法中執(zhí)行放置消息。
本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載裝置中,還可以包括:
第二放置模塊,用于在數(shù)據(jù)加載消息之后放置預設回調(diào)函數(shù)。
需要說明的是,本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載裝置中相關部分的說明請參見本發(fā)明實施例提供的一種數(shù)據(jù)延遲加載方法中對應部分的詳細說明,在此不再贅述。
對所公開的實施例的上述說明,使本領域技術人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對這些實施例的多種修改對本領域技術人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實施例中實現(xiàn)。因此,本發(fā)明將不會被限制于本文所示的這些實施例,而是要符合與本文所公開的原理和新穎特點相一致的最寬的范圍。