±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÍøÂ磬±¾ÎÄÏêϸ½éÉÜÁËÃÀÍÅ×Ô¼ºÊµÏÖµÄÒ»Ì×ÎÞÐèÒµÎñ´úÂëÇÖÈëµÄ×Ô¶¯»¯Ò³Ãæ²âËÙ²å¼þ£¬²¢¶ÔÆäÔÀí×öÁËһЩ½â¶ÁºÍ·ÖÎö¡£ |
|
±³¾°
Ëæ×ÅÒÆ¶¯»¥ÁªÍøµÄ¿ìËÙ·¢Õ¹£¬Òƶ¯Ó¦ÓÃÔ½À´Ô½×¢ÖØÓû§ÌåÑé¡£ÃÀÍż¼ÊõÍŶÓÔÚ¿ª·¢¹ý³ÌÖÐÒ²·Ç³£×¢ÖØÌáÉýÒÆ¶¯Ó¦ÓõÄÕûÌåÖÊÁ¿£¬ÆäÖкÜÖØÒªµÄÒ»ÏîÄÚÈݾÍÊÇÒ³ÃæµÄ¼ÓÔØËÙ¶È¡£Èç¹û·¢ÉúÀäÆô¶¯Ê±¼ä¹ý³¤¡¢Ò³ÃæäÖȾʱ¼ä¹ý³¤¡¢ÍøÂçÇëÇó¹ýÂýµÈÏÖÏ󣬾ͻáÖ±½ÓÓ°Ïìµ½Óû§µÄÌåÑ飬ËùÒÔ£¬ÈçºÎ¼à¿ØÕû¸öÏîÄ¿µÄ¼ÓÔØËٶȾͳÉΪÎÒÃDz¿ÃÅÃæÁÙµÄÖØÒªÌôÕ½¡£
¶ÔÓÚ²âËÙÕâ¸öÎÊÌ⣬ºÜ¶àͬѧÊ×ÏÈ»áÏëµ½ÔÚÒ³ÃæÖеIJ»Í¬½Úµã¼ÓÈë¼ÆËãʱ¼äµÄ´úÂ룬ÒÔ´ËËã³öij¶Îʱ¼ä³¤¶È¡£È»¶ø£¬Ëæ×ÅÃÀÍÅÒµÎñµÄ¿ìËÙµü´ú£¬»áÓÐÔ½À´Ô½¶àµÄÐÂÒ³Ãæ¡¢Ô½À´Ô½¶àµÄÒµÎñÂß¼¡¢Ô½À´Ô½¶àµÄ´úÂë¸Ä¶¯£¬ÕâЩ²»È·¶¨ÐÔ»áʹÎÒÃDzâËÙ²¿·ÖµÄ´úÂëñîºÏ½øÒµÎñÂß¼£¬²¢ÇÒÐèÒªÊÖ¶¯Î¬»¤£¬½ø¶øÔö¼ÓÁ˳ɱ¾ºÍ·çÏÕ¡£ÓÚÊÇͨ¹ý½è¼ø¹«Ë¾ÏÈǰµÄ·½°¸Hertz£¬·ÖÎöÆä´æÔÚµÄÎÊÌâ²¢½áºÏ×ÔÉíÌØÐÔ£¬ÎÒÃÇʵÏÖÁËÒ»Ì×ÎÞÐèÒµÎñ´úÂëÇÖÈëµÄ×Ô¶¯»¯Ò³Ãæ²âËÙ²å¼þ£¬±¾ÎĽ«¶ÔÆäÔÀí×öһЩ½â¶ÁºÍ·ÖÎö¡£
ÏÖÓнâ¾ö·½°¸Hertz
* ÊÖ¶¯ÔÚ Application.onCreate() ÖнøÐÐSDKµÄ³õʼ»¯µ÷Óã¬Í¬Ê±¼ÆËãÀäÆô¶¯Ê±¼ä¡£

ÊÖ¶¯ÔÚActivityÉúÃüÖÜÆÚ·½·¨ÖÐÌí¼Ó´úÂ룬¼ÆËãÒ³Ãæ²»Í¬½×¶ÎµÄʱ¼ä¡£
ÊÖ¶¯Îª Activity.setContentView() ÉèÖõÄViewÉÏ£¬Ìí¼ÓÒ»²ã×Ô¶¨Ò常View£¬ÓÃÓÚ¼ÆËã»æÖÆÍê³ÉµÄʱ¼ä¡£
ÊÖ¶¯ÔÚÿ¸öÍøÂçÇëÇó¿ªÊ¼Ç°ºÍ½áÊøºóÌí¼Ó´úÂ룬¼ÆËãÍøÂçÇëÇóµÄʱ¼ä¡£

±¾µØÉùÃ÷JSONÅäÖÃÎļþÀ´È·¶¨ÐèÒª²âËÙµÄÒ³ÃæÒÔ¼°¸ÃÒ³ÃæÐèҪͳ¼ÆµÄ³õÊ¼ÍøÂçÇëÇóAPI£¬ getClass().getSimpleName()
×÷ÎªÒ³ÃæµÄkey£¬À´±êʶÄÄÐ©Ò³ÃæÐèÒª²âËÙ£¬Ö¸¶¨Ò»×éAPIÀ´±êʶÄÄЩÇëÇóÊÇÐèÒª±»²âËٵġ£

ÏÖÓз½°¸ÎÊÌâ
* ÀäÆô¶¯Ê±¼ä²»×¼£ºÀäÆô¶¯Æðʼʱ¼ä´Ó Application.onCreate() ÖпªÊ¼ËãÆð£¬»áʹµÃ¼ÆËã³öÀ´µÄÀäÆô¶¯Ê±¼äƫС£¬ÒòΪÔڸ÷½·¨Ö´ÐÐǰ¿ÉÄÜ»áÓÐ
MultiDex.install() µÈºÄʱ·½·¨µÄÖ´ÐС£
* ÌØÊâÇé¿öδ¿¼ÂÇ£ººöÂÔÁËViewPager+FragmentÑÓʱ¼ÓÔØÕâЩ³£¼û¶ø¸´ÔÓµÄÇé¿ö£¬ÕâЩÇé¿ö»áÔì³Éʵ¼Ê²âËÙʱ¼ä·Ç³£²»×¼¡£
* ÊÖ¶¯×¢Èë´úÂ룺ËùÓеĴúÂë¶¼ÐèÒªÊÖ¶¯Ð´È룬ñîºÏ½øÒµÎñÂß¼ÖУ¬ÄÑÒÔά»¤²¢ÇÒËæ×ÅÐÂÒ³ÃæµÄ¼ÓÈëÈÝÒ×ÒÅ©¡£
* дËÀÅäÖÃÎļþ£ºÈçÐèÌí¼Ó»ò¸ü¸ÄÒª²âËÙµÄÒ³Ãæ£¬ÔòÐèÒªÐ޸ı¾µØÅäÖÃÎļþ£¬½øÐз¢°æ¡£
Ä¿±ê·½°¸Ð§¹û
* ×Ô¶¯×¢Èë´úÂ룬ÎÞÐèÊÖ¶¯Ð´Èë´úÂëÓëÒµÎñÂß¼ñîºÏ¡£
* Ö§³ÖActivityºÍFragmentÒ³Ãæ²âËÙ£¬²¢½â¾öViewPager+FragmentÑÓ³Ù¼ÓÔØÊ±²âËÙ²»×¼µÄÎÊÌâ¡£
* ÔÚApplicationµÄ¹¹Ô캯ÊýÖпªÊ¼ÀäÆô¶¯Ê±¼ä¼ÆËã¡£
* ×Ô¶¯ÀÈ¡ºÍ¸üÐÂÅäÖÃÎļþ£¬¿ÉÒÔʵʱµÄ½øÐÐÅäÖÃÎļþµÄ¸üС£
ʵÏÖ
ÎÒÃÇҪʵÏÖÒ»¸ö×Ô¶¯»¯µÄ²âËÙ²å¼þ£¬ÐèÒª·ÖΪÎå²½½øÐУº
1. ²âËÙ¶¨Ò壺ȷ¶¨ÐèÒª²âÁ¿µÄËÙ¶ÈÖ¸±ê²¢¶¨ÒåÆä¼ÆË㷽ʽ¡£
2. ÅäÖÃÎļþ£ºÍ¨¹ýÅäÖÃÎļþÈ·¶¨´úÂëÖÐÐèÒª²âÁ¿ËÙ¶ÈÖ¸±êµÄλÖá£
3. ²âËÙʵÏÖ£ºÈçºÎʵÏÖʱ¼äµÄ¼ÆËãºÍÉϱ¨¡£
4. ×Ô¶¯»¯ÊµÏÖ£ºÈçºÎ×Ô¶¯»¯ÊµÏÖÒ³Ãæ²âËÙ£¬²»ÐèÒªÊÖ¶¯×¢Èë´úÂë¡£
5. ÒÉÄÑÔÓÖ¢£º·ÖÎö²¢½â¾öÌØÊâÇé¿ö¡£
²âËÙ¶¨Òå
ÎÒÃǰÑÒ³Ãæ¼ÓÔØÁ÷³Ì³éÏó³ÉÒ»¸öͨÓõĹý³ÌÄ£ÐÍ£ºÒ³Ãæ³õʼ»¯ -> ³õ´ÎäÖȾÍê³É -> ÍøÂçÇëÇ󷢯ð
-> ÇëÇóÍê³É²¢Ë¢ÐÂÒ³Ãæ -> ¶þ´ÎäÖȾÍê³É¡£¾Ý´Ë£¬Òª²âÁ¿µÄÄÚÈݰüÀ¨ÒÔÏ·½Ã棺
* ÏîÄ¿µÄÀäÆô¶¯Ê±¼ä£º´ÓApp±»´´½¨£¬Ò»Ö±µ½ÎÒÃÇÊ×Ò³³õ´Î»æÖƳöÀ´Ëù¾ÀúµÄʱ¼ä¡£
* Ò³ÃæµÄ³õ´ÎäÖȾʱ¼ä£º´ÓActivity»òFragmentµÄ onCreate() ·½·¨¿ªÊ¼£¬Ò»Ö±µ½Ò³ÃæViewµÄ³õ´ÎäÖȾÍê³ÉËù¾ÀúµÄʱ¼ä¡£
* Ò³ÃæµÄ³õÊ¼ÍøÂçÇëÇóʱ¼ä£ºActivity»òFragmentÖ¸¶¨µÄÒ»×é³õʼÇëÇó£¬È«²¿Íê³ÉËùÓõÄʱ¼ä¡£
* Ò³ÃæµÄ¶þ´ÎäÖȾʱ¼ä£ºActivity»òFragmentËùÓеijõʼÇëÇóÍê³Éºó£¬µ½Ò³ÃæViewÔÙ´ÎäÖȾÍê³ÉËù¾ÀúµÄʱ¼ä¡£
ÐèҪעÒâµÄÊÇ£¬ÍøÂçÇëÇóʱ¼äÊÇÖ¸¶¨µÄÒ»×éÇëÇóÈ«²¿Íê³ÉµÄʱ¼ä£¬¼´´ÓµÚÒ»¸öÇëÇ󷢯ð¿ªÊ¼£¬Ö±µ½×îºóÒ»¸öÇëÇóÍê³ÉËùÓõÄʱ¼ä¡£
¸ù¾Ý¶¨ÒåÎÒÃǵIJâËÙÄ£ÐÍÈçÏÂͼËùʾ¡£

ÅäÖÃÎļþ
½ÓÏÂÀ´ÒªÖªµÀÄÄÐ©Ò³ÃæÐèÒª²âËÙ£¬ÒÔ¼°Ò³ÃæµÄ³õʼÇëÇóÊÇÄÄЩAPI£¬ÕâÐèÒªÒ»¸öÅäÖÃÎļþÀ´¶¨Òå¡£
<page id="HomeActivity"
tag="1"> <api id="/api/config"/>
<api id="/api/list"/>
</page>
<page id="com.test.MerchantFragment"
tag="0"> <api id="/api/test1"/>
</page> |
ÎÒÃǶ¨ÒåÁËÒ»¸öXMLÅäÖÃÎļþ£¬Ã¿¸ö <page/> ±êÇ©´ú±íÁËÒ»¸öÒ³Ãæ£¬ÆäÖÐ id ÊÇÒ³ÃæµÄÀàÃû»òÕßȫ·¾¶ÀàÃû£¬ÓÃÒÔ±íʾÄÄЩActivity»òÕßFragmentÐèÒª²âËÙ£»
tag ´ú±íÊÇ·ñΪÊ×Ò³£¬Õâ¸öÊ×Ò³Ö¸µÄÊÇÓÃÒÔ¼ÆËãÀäÆô¶¯½áÊøÊ±¼äµÄÒ³Ãæ£¬±ÈÈçÎÒÃÇÏë°ÑÀäÆô¶¯Ê±¼ä¶¨ÒåΪ´ÓApp´´½¨µ½HomeActivityչʾËùÐèÒªµÄʱ¼ä£¬ÄÇôHomeActivityµÄtag¾ÍΪ1£»Ã¿Ò»¸ö
<api/> ´ú±íÕâ¸öÒ³ÃæµÄÒ»¸ö³õʼÇëÇ󣬱ÈÈçHomeActivityÒ³ÃæÊǸöÁбíÒ³£¬Ò»½øÀ´»áÏÈÇëÇóconfig½Ó¿Ú£¬È»ºóÇëÇólist½Ó¿Ú£¬µ±list½Ó¿Ú»ØÀ´ºóչʾÁбíÊý¾Ý£¬ÄÇô¸ÃÒ³ÃæµÄ³õʼÇëÇó¾ÍÊÇconfigºÍlist½Ó¿Ú¡£¸üÖØÒªµÄÒ»µãÊÇ£¬ÎÒÃǽ«¸ÃÅäÖÃÎļþά»¤ÔÚ·þÎñ¶Ë£¬¿ÉÒÔʵʱ¸üУ¬¶ø¿Í»§¶ËÒª×öµÄÖ»ÊÇÔÚ²å¼þSDK³õʼ»¯Ê±ÀÈ¡×îеÄÅäÖÃÎļþ¼´¿É¡£
²âËÙʵÏÖ
²âËÙÐèҪʵÏÖÒ»¸öSDK£¬ÓÃÓÚ¹ÜÀíÅäÖÃÎļþ¡¢Ò³Ãæ²âËÙ¶ÔÏó¡¢¼ÆËãʱ¼ä¡¢Éϱ¨Êý¾ÝµÈ£¬ÏîÄ¿½ÓÈëºó£¬ÔÚÒ³ÃæµÄ²»Í¬½Úµãµ÷ÓÃSDKÌṩµÄ·½·¨Íê³É²âËÙ¡£
ÀäÆô¶¯¿ªÊ¼Ê±¼ä
ÀäÆô¶¯µÄ¿ªÊ¼Ê±¼ä£¬ÎÒÃÇÒÔApplicationµÄ¹¹Ô캯Êý±»µ÷ÓÃΪ׼£¬ÔÚ¹¹Ô캯ÊýÖнøÐÐʱ¼äµã¼Ç¼£¬²¢ÔÚSDK³õʼ»¯Ê±£¬½«Ê±¼äµã´«Èë×÷ΪÀäÆô¶¯¿ªÊ¼Ê±¼ä¡£
//Application
public MyApplication(){
super();
coldStartTime = SystemClock.elapsedRealtime();
}
//SDK³õʼ»¯
public void onColdStart(long coldStartTime) {
this.startTime = coldStartTime;
} |
ÕâÀï˵Ã÷¼¸µã£º
* SDKÖÐËùÓеÄʱ¼ä»ñÈ¡¶¼Ê¹Óà SystemClock.elapsedRealtime() »úÆ÷ʱ¼ä£¬±£Ö¤ÁËʱ¼äµÄÒ»ÖÂÐÔºÍ׼ȷÐÔ¡£
* ÀäÆô¶¯³õʼʱ¼äÒÔ¹¹Ô캯ÊýΪ׼£¬¿ÉÒÔËãÈëMultiDex×¢ÈëµÄʱ¼ä£¬±ÈÔÚ onCreate() ÖмÆËã¸üΪ׼ȷ¡£
* ÔÚ¹¹Ô캯ÊýÖÐÖ±½Óµ÷ÓÃJavaµÄAPIÀ´¼ÆËãʱ¼ä£¬Ö®ºó´«ÈëSDKÖУ¬¶ø²»ÊÇÖ±½Óµ÷ÓÃSDKµÄ·½·¨£¬ÊÇΪÁË·ÀÖ¹MultiDex×¢Èë֮ǰ£¬µ÷Óõ½Î´×¢ÈëµÄDexÖеÄÀà¡£
SDK³õʼ»¯
SDKµÄ³õʼ»¯ÔÚ Application.onCreate() Öе÷Ó㬳õʼ»¯Ê±»á»ñÈ¡·þÎñ¶ËµÄÅäÖÃÎļþ£¬½âÎöΪ
Map<String,PageObject> £¬¶ÔÓ¦ÅäÖÃÖÐÒ³ÃæµÄidºÍÆäÅäÖÃÏî¡£ÁíÍ⻹ά»¤ÁËÒ»¸öµ±Ç°Ò³Ãæ¶ÔÏóµÄ
MAP<Integer, Object> £¬keyΪһ¸öintÖµ¶ø²»ÊÇÆäÀàÃû£¬ÒòΪͬһ¸öÀà¿ÉÄÜÓжà¸öʵÀýͬʱÔÚÔËÐУ¬Èç¹û´æÎªÒ»¸ökey£¬¿ÉÄܻᵼÖÂÍ¬Ò»Ò³Ãæ²»Í¬ÊµÀýµÄ²âËÙ¶ÔÏóÖ»ÓÐÒ»¸ö£¬ËùÒÔÔÚÕâÀïÎÒÃÇʹÓÃActivity»òFragmentµÄ
hashcode() Öµ×÷ÎªÒ³ÃæµÄΨһ±êʶ¡£
Ò³Ãæ¿ªÊ¼Ê±¼ä
Ò³ÃæµÄ¿ªÊ¼Ê±¼ä£¬ÎÒÃÇÒÔActivtiy»òFragmentµÄ onCreate() ×÷Ϊʱ¼ä½Úµã½øÐмÆË㣬¼ÇÂ¼Ò³ÃæµÄ¿ªÊ¼Ê±¼ä¡£
public void
onPageCreate(Object page) {
int pageObjKey = Utils.getPageObjKey(page);
PageObject pageObject = activePages.get(pageObjKey);
ConfigModel configModel = getConfigModel(page);//»ñÈ¡¸ÃÒ³ÃæµÄÅäÖÃ
if (pageObject == null && configModel
!= null) {//ÓÐÅäÖÃÔòÐèÒª²âËÙ
pageObject = new PageObject(pageObjKey, configModel,
Utils.getDefaultReportKey(page), callback);
pageObject.onCreate();
activePages.put(pageObjKey, pageObject);
}
}
//PageObject.onCreate()
void onCreate() {
if (createTime > 0) {
return;
}
createTime = Utils.getRealTime();
} |
ÕâÀïµÄ getConfigModel() ·½·¨ÖУ¬»áʹÓÃÒ³ÃæµÄÀàÃû»òÕßȫ·¾¶ÀàÃû£¬È¥³õʼ»¯Ê±½âÎöµÄÅäÖÃMapÖнøÐÐidµÄÆ¥Å䣬Èç¹ûÆ¥Å䵽˵Ã÷Ò³ÃæÐèÒª²âËÙ£¬¾Í»á´´½¨²âËÙ¶ÔÏó
PageObject ½øÐвâËÙ¡£
ÍøÂçÇëÇóʱ¼ä
Ò»¸öÒ³ÃæµÄ³õʼÇëÇóÓÉÅäÖÃÎļþÖ¸¶¨£¬ÎÒÃÇÖ»ÐèÔÚµÚÒ»¸öÇëÇ󷢯ðǰ¼Ç¼ÇëÇó¿ªÊ¼Ê±¼ä£¬ÔÚ×îºóÒ»¸öÇëÇó»ØÀ´ºó¼Ç¼½áÊøÊ±¼ä¼´¿É¡£
boolean onApiLoadStart(String
url) {
String relUrl = Utils.getRelativeUrl(url);
if (!hasApiConfig() || !hasUrl(relUrl) || apiStatusMap.get(relUrl.hashCode())
!= NONE) {
return false;
}
//¸Ä±äUrlµÄ״̬ΪִÐÐÖÐ
apiStatusMap.put(relUrl.hashCode(), LOADING);
//µÚÒ»¸öÇëÇó¿ªÊ¼Ê±¼Ç¼Æðʼµã
if (apiLoadStartTime <= 0) {
apiLoadStartTime = Utils.getRealTime();
}
return true;
}
boolean onApiLoadEnd(String url) {
String relUrl = Utils.getRelativeUrl(url);
if (!hasApiConfig() || !hasUrl(relUrl) || apiStatusMap.get(relUrl.hashCode())
!= LOADING) {
return false;
}
//¸Ä±äUrlµÄ״̬ΪִÐнáÊø
apiStatusMap.put(relUrl.hashCode(), LOADED);
//È«²¿ÇëÇó½áÊøºó¼Ç¼ʱ¼ä
if (apiLoadEndTime <= 0 && allApiLoaded())
{
apiLoadEndTime = Utils.getRealTime();
}
return true;
}
private boolean allApiLoaded() {
if (!hasApiConfig()) return true;
int size = apiStatusMap.size();
for (int i = 0; i < size; ++i) {
if (apiStatusMap.valueAt(i) != LOADED) {
return false;
}
}
return true;
} |
ÿ¸öÒ³ÃæµÄ²âËÙ¶ÔÏó£¬Î¬»¤ÁËÒ»¸öÇëÇóurlºÍÆä״̬µÄÓ³Éä¹ØÏµ SparseIntArray £¬key¾ÍΪÇëÇóurlµÄhashcode£¬×´Ì¬³õʼΪ
NONE ¡£Ã¿´ÎÇëÇ󷢯ðʱ£¬½«¶ÔÓ¦urlµÄ״̬ÖÃΪ LOADING £¬½áÊøÊ±ÖÃΪ LOADED ¡£µ±µÚÒ»¸öÇëÇ󷢯ðʱ¼Ç¼Æðʼʱ¼ä£¬µ±ËùÓÐurl״̬Ϊ
LOADED ʱ˵Ã÷ËùÓÐÇëÇóÍê³É£¬¼Ç¼½áÊøÊ±¼ä¡£
äÖȾʱ¼ä
°´ÕÕÎÒÃǶԲâËٵ͍Ò壬ÏÖÔÚÀäÆô¶¯¿ªÊ¼Ê±¼äÓÐÁË£¬»¹²î½áÊøÊ±¼ä£¬¼´Ö¸¶¨µÄÊ×Ò³³õ´ÎäÖȾ½áÊøÊ±µÄʱ¼ä£»Ò³ÃæµÄ¿ªÊ¼Ê±¼äÓÐÁË£¬»¹²îÒ³Ãæ³õ´ÎäÖȾµÄ½áÊøÊ±¼ä£»ÍøÂçÇëÇóµÄ½áÊøÊ±¼äÓÐÁË£¬»¹²îÒ³ÃæµÄ¶þ´ÎäÖȾµÄ½áÊøÊ±¼ä¡£ÕâÒ»Çж¼ÊǺÍÒ³ÃæµÄViewäÖȾʱ¼äÓйأ¬ÄÇôÔõô»ñÈ¡Ò³ÃæµÄäÖȾ½áÊøÊ±¼äµãÄØ£¿

ÓÉViewµÄ»æÖÆÁ÷³Ì¿ÉÖª£¬¸¸ViewµÄ dispatchDraw() ·½·¨»áÖ´ÐÐÆäËùÓÐ×ÓViewµÄ»æÖƹý³Ì£¬ÄÇô°ÑÒ³ÃæµÄ¸ùViewµ±×ö×ÓView£¬ÊDz»ÊÇ¿ÉÒÔÔÚÆäÍⲿÔö¼ÓÒ»²ã¸¸View£¬ÒÔÆä
dispatchDraw() ×÷ÎªÒ³Ãæ»æÖÆÍê±ÏµÄʱ¼äµãÄØ£¿´ð°¸ÊÇ¿ÉÒԵġ£
class AutoSpeedFrameLayout
extends FrameLayout {
public static View wrap(int pageObjectKey, @NonNull
View child) {
...
//½«Ò³Ãæ¸ùView×÷Ϊ×ÓView£¬ÆäËû²ÎÊý±£³Ö²»±ä
ViewGroup vg = new AutoSpeedFrameLayout(child .getContext(),
pageObjectKey);
if (child.getLayoutParams() != null) {
vg.setLayoutParams(child.getLayoutParams());
}
vg.addView(child, new ViewGroup.LayoutParams(ViewGroup.LayoutParams .MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
return vg;
}
private final int pageObjectKey;//¹ØÁªµÄÒ³Ãækey
private AutoSpeedFrameLayout(@NonNull Context
context , int pageObjectKey) {
super(context);
this.pageObjectKey = pageObjectKey;
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
AutoSpeed.getInstance().onPageDrawEnd(pageObjectKey);
}
} |
ÎÒÃÇ×Ô¶¨ÒåÁËÒ»²ã FrameLayout ×÷ΪËùÓÐÒ³Ãæ¸ùViewµÄ¸¸View£¬Æä dispatchDraw()
·½·¨Ö´ÐÐsuperºó£¬¼Ç¼Ïà¹ØÒ³Ãæ»æÖƽáÊøµÄʱ¼äµã¡£
²âËÙÍê³É
ÏÖÔÚËùÓÐʱ¼äµã¶¼ÓÐÁË£¬ÄÇôʲôʱºòËã×÷²âËÙ¹ý³Ì½áÊøÄØ£¿ÎÒÃÇÀ´¿´¿´Ã¿´ÎäÖȾ½áÊøºóµÄ´¦Àí¾ÍÖªµÀÁË¡£
//PageObject.onPageDrawEnd()
void onPageDrawEnd() {
if (initialDrawEndTime <= 0) {//³õ´ÎäÖȾ»¹Ã»ÓÐÍê³É
initialDrawEndTime = Utils.getRealTime();
if (!hasApiConfig() || allApiLoaded()) {//Èç¹ûûÓÐÇëÇóÅäÖûòÕßÇëÇóÒÑÍê³É£¬ÔòûÓжþ´ÎäÖȾʱ¼ä£¬¼´³õ´ÎäÖȾʱ¼ä¼´ÎªÒ³ÃæÕûÌåʱ¼ä£¬ÇÒ¿ÉÒÔÉϱ¨½áÊøÒ³ÃæÁË
finalDrawEndTime = -1;
reportIfNeed();
}
//Ò³Ãæ³õ´Îչʾ£¬»Øµ÷£¬ÓÃÓÚͳ¼ÆÀäÆô¶¯½áÊø
callback.onPageShow(this);
return;
}
//Èç¹û¶þ´ÎäÖȾûÓÐÍê³É£¬ÇÒËùÓÐÇëÇóÒѾÍê³É£¬Ôò¼Ç¼¶þ´ÎäÖȾʱ¼ä²¢½áÊø²âËÙ£¬Éϱ¨Êý¾Ý
if (finalDrawEndTime <= 0 && (!hasApiConfig()
|| allApiLoaded())) {
finalDrawEndTime = Utils.getRealTime();
reportIfNeed();
}
} |

¸Ã·½·¨ÓÃÓÚ´¦ÀíäÖȾÍê±ÏµÄ¸÷ÖÖÇé¿ö£¬°üÀ¨³õ´ÎäÖȾʱ¼ä¡¢¶þ´ÎäÖȾʱ¼ä¡¢ÀäÆô¶¯Ê±¼äÒÔ¼°ÏàÓ¦µÄÉϱ¨¡£ÕâÀïµÄÀäÆô¶¯ÔÚ
callback.onPageShow(this) ÊÇÈçºÎ´¦ÀíµÄÄØ£¿
//³õ´ÎäÖȾÍê³ÉʱµÄ»Øµ÷
void onMiddlePageShow(boolean isMainPage) {
if (!isFinish && isMainPage &&
startTime > 0 && endTime <= 0) {
endTime = Utils.getRealTime();
callback.onColdStartReport(this);
finish();
}
} |
»¹¼ÇµÃÅäÖÃÎļþÖÐ tag ô£¬ËûµÄ×÷ÓþÍÊÇÖ¸Ã÷¸ÃÒ³ÃæÊÇ·ñΪÊ×Ò³£¬Ò²¾ÍÊÇ´úÂë¶ÎÀïµÄ isMainPage
²ÎÊý¡£Èç¹ûÊÇÊ×Ò³µÄ»°£¬ËµÃ÷Ê×Ò³µÄ³õ´ÎäÖȾ½áÊø£¬¾Í¿ÉÒÔ¼ÆËãÀäÆô¶¯½áÊøµÄʱ¼ä²¢½øÐÐÉϱ¨ÁË¡£
Éϱ¨Êý¾Ý
µ±²âËÙÍê³Éºó£¬Ò³Ãæ²âËÙ¶ÔÏó PageObject ÀïÒѾ¼Ç¼ÁËÒ³Ãæ£¨°üÀ¨ÀäÆô¶¯£©¸÷¸öʱ¼äµã£¬Ê£ÏµÄÖ»ÐèÒª½øÐвâËٽ׶εļÆËã²¢½øÐÐÍøÂçÉϱ¨¼´¿É¡£
//¼ÆËãÍøÂçÇëÇóʱ¼ä
long getApiLoadTime() {
if (!hasApiConfig() || apiLoadEndTime <= 0
|| apiLoadStartTime <= 0) {
return -1;
}
return apiLoadEndTime - apiLoadStartTime;
} |
×Ô¶¯»¯ÊµÏÖ
ÓÐÁËSDK£¬¾ÍÒªÔÚÎÒÃǵÄÏîÄ¿ÖнÓÈ룬²¢ÔÚÏàÓ¦µÄλÖõ÷ÓÃSDKµÄAPIÀ´ÊµÏÖ²âËÙ¹¦ÄÜ£¬ÄÇôÈçºÎ×Ô¶¯»¯ÊµÏÖAPIµÄµ÷ÓÃÄØ£¿´ð°¸¾ÍÊDzÉÓÃAOPµÄ·½Ê½£¬ÔÚApp±àÒëʱ¶¯Ì¬×¢Èë´úÂ룬ÎÒÃÇʵÏÖÒ»¸öGradle²å¼þ£¬ÀûÓÃÆäTransform¹¦ÄÜÒÔ¼°JavassistʵÏÖ´úÂëµÄ¶¯Ì¬×¢Èë¡£¶¯Ì¬×¢Èë´úÂë·ÖΪÒÔϼ¸²½£º
³õʼ»¯Âñµã£ºSDKµÄ³õʼ»¯¡£
ÀäÆô¶¯Âñµã£ºApplicationµÄÀäÆô¶¯¿ªÊ¼Ê±¼äµã¡£
Ò³ÃæÂñµã£ºActivityºÍFragmentÒ³ÃæµÄʱ¼äµã¡£
ÇëÇóÂñµã£ºÍøÂçÇëÇóµÄʱ¼äµã¡£
³õʼ»¯Âñµã
ÔÚ Transform ÖбéÀúËùÓÐÉú³ÉµÄclassÎļþ£¬ÕÒµ½Application¶ÔÓ¦µÄ×ÓÀ࣬ÔÚÆä
onCreate() ·½·¨Öе÷ÓÃSDK³õʼ»¯API¼´¿É¡£
CtMethod method
= it.getDeclaredMethod("onCreate")
method.insertBefore("${Constants.AUTO_SPEED_CLASSNAME} .getInstance().init(this);") |
×îÖÕÉú³ÉµÄApplication´úÂëÈçÏ£º
public void
onCreate() {
...
AutoSpeed.getInstance().init(this);
} |
ÀäÆô¶¯Âñµã
ͬÉÏÒ»²½£¬ÕÒµ½Application¶ÔÓ¦µÄ×ÓÀ࣬ÔÚÆä¹¹Ôì·½·¨ÖмǼÀäÆô¶¯¿ªÊ¼Ê±¼ä£¬ÔÚSDK³õʼ»¯Ê±ºò´«ÈëSDK£¬ÔÒòÔÚÉÏÎÄÒѾ½âÊ͹ý¡£
//Application
private long coldStartTime;
public MobileCRMApplication() {
coldStartTime = SystemClock.elapsedRealtime();
}
public void onCreate(){
...
AutoSpeed.getInstance().init(this,coldStartTime);
} |
Ò³ÃæÂñµã
½áºÏ²âËÙʱ¼äµãµÄ¶¨ÒåÒÔ¼°ActivityºÍFragmentµÄÉúÃüÖÜÆÚ£¬ÎÒÃÇÄܹ»È·¶¨Ôں䦵÷ÓÃÏàÓ¦µÄAPI¡£

Activity
¶ÔÓÚActivityÒ³Ãæ£¬ÏÖÔÚ¿ª·¢ÕßÒѾºÜÉÙÖ±½ÓʹÓà android.app.Activity ÁË£¬È¡¶ø´úÖ®µÄÊÇ
android.support.v4.app.FragmentActivity ºÍ android.support.v7.app.AppCompatActivity
£¬ËùÒÔÎÒÃÇÖ»ÐèÔÚÕâÁ½¸ö»ùÀàÖнøÐÐÂñµã¼´¿É£¬ÎÒÃÇÏÈÀ´¿´FragmentActivity¡£
protected void
onCreate(@Nullable Bundle savedInstanceState)
{
AutoSpeed.getInstance().onPageCreate(this);
...
}
public void setContentView(View var1) {
super.setContentView(AutoSpeed.getInstance() .createPageView(this,
var1));
} |
×¢Èë´úÂëºó£¬ÔÚFragmentActivityµÄ onCreate Ò»¿ªÊ¼µ÷ÓÃÁË onPageCreate()
·½·¨½øÐÐÁËÒ³Ãæ¿ªÊ¼Ê±¼äµãµÄ¼ÆË㣻ÔÚ setContentView() ÄÚ²¿£¬Ö±½Óµ÷ÓÃsuper£¬²¢½«Ò³Ãæ¸ùView°ü×°ÔÚÎÒÃÇ×Ô¶¨ÒåµÄ
AutoSpeedFrameLayout Öд«È룬ÓÃÓÚäÖȾʱ¼äµãµÄ¼ÆËã¡£
È»¶øÔÚAppCompatActivityÖУ¬ÖØÐ´ÁËsetContentView()·½·¨£¬ÇÒûÓе÷ÓÃsuper£¬µ÷ÓõÄÊÇ
AppCompatDelegate µÄÏàÓ¦·½·¨¡£
public void
setContentView(View view) {
getDelegate().setContentView(view);
} |
Õâ¸ödelegateÀàÓÃÓÚÊÊÅ䲻ͬ°æ±¾µÄActivityµÄһЩÐÐΪ£¬¶ÔÓÚsetContentView£¬Î޷ǾÍÊǽ«¸ùView´«ÈëdelegateÏàÓ¦µÄ·½·¨£¬ËùÒÔÎÒÃÇ¿ÉÒÔÖ±½Ó°ü×°View£¬µ÷ÓÃdelegateÏàÓ¦·½·¨²¢´«Èë¼´¿É¡£
public void
setContentView(View view) {
AppCompatDelegate var2 = this.getDelegate();
var2.setContentView(AutoSpeed.getInstance() .createPageView(this,
view));
} |
¶ÔÓÚActivityµÄsetContentViewÂñµãÐèҪעÒâµÄÊÇ£¬¸Ã·½·¨ÊÇÖØÔØ·½·¨£¬ÎÒÃÇÐèÒª¶Ôÿ¸öÖØÔØµÄ·½·¨×ö´¦Àí¡£
Fragment
FragmentµÄ onCreate() ÂñµãºÍActivityÒ»Ñù£¬²»±Ø¶à˵¡£ÕâÀïÖ÷Ҫ˵Ï onCreateView()
£¬Õâ¸ö·½·¨ÊÇ·µ»ØÖµ´ú±í¸ùView£¬¶ø²»ÊÇÖ±½Ó´«ÈëView£¬¶øJavassistÎÞ·¨µ¥¶ÀÐ޸ķ½·¨µÄ·µ»ØÖµ£¬ËùÒÔÎÞ·¨ÏñActivityµÄsetContentViewÄÇÑù×¢Èë´úÂ룬²¢ÇÒÕâ¸ö·½·¨²»ÊÇ
@CallSuper µÄ£¬Òâζ×Ų»ÄÜÔÚ»ùÀàÀïʵÏÖ¡£ÄÇôÔõô°ìÄØ£¿ÎÒÃǾö¶¨ÔÚÿ¸öFragmentµÄ¸Ã·½·¨ÉÏ×öһЩÊÂÇé¡£
//Fragment±ê־λ
protected static boolean AUTO_SPEED_FRAGMENT_CREATE_VIEW_FLAG
= true;
//ÀûÓõݹé°ü×°¸ùView
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle
savedInstanceState) {
if(AUTO_SPEED_FRAGMENT_CREATE_VIEW_FLAG) {
AUTO_SPEED_FRAGMENT_CREATE_VIEW_FLAG = false;
View var4 = AutoSpeed.getInstance().createPageView(this,
this.onCreateView(inflater, container, savedInstanceState));
AUTO_SPEED_FRAGMENT_CREATE_VIEW_FLAG = true;
return var4;
} else {
...
return rootView;
}
} |
ÎÒÃÇÀûÓÃÒ»¸öbooleanÀàÐ͵ıê־룬½øÐеݹéµ÷Óà onCreateView() ·½·¨£º
1. ×î³õµ÷ÓÃʱ£¬»á½«±ê־λÖÃΪfalse£¬È»ºóµÝ¹éµ÷Óø÷½·¨¡£
2. µÝ¹éµ÷ÓÃʱ£¬ÓÉÓÚ±ê־λΪfalseËùÒÔ»áµ÷ÓÃÔÓÐÂß¼£¬¼´»ñÈ¡¸ùView¡£
3. »ñÈ¡¸ùViewºó£¬°üװΪ AutoSpeedFrameLayout ·µ»Ø¡£
²¢ÇÒÓÉÓÚ±ê־λΪfalse£¬ËùÒÔÔڵݹéµ÷ÓÃʱ£¬¼´Ê¹µ÷ÓÃÁË super.onCreateView()
·½·¨£¬ÔÚ¸¸ÀàµÄ¸Ã·½·¨ÖÐÒ²²»»á×ßif·ÖÖ§£¬¶øÊÇÖ±½Ó·µ»ØÆä¸ùView¡£
ÇëÇóÂñµã
¹ØÓÚÇëÇóÂñµãÎÒÃÇÕë¶Ô²»Í¬µÄÍøÂç¿ò¼Ü½øÐв»Í¬µÄ´¦Àí£¬²å¼þÖÐÖ»ÐèÒªÅäÖÃʹÓÃÁËÄÄÐ©ÍøÂç¿ò¼Ü¼´¿ÉʵÏÖÂñµã£¬ÎÒÃÇÄÃÏÖÔÚÓõÄ×î¶àµÄ
Retrofit ¿ò¼ÜÀ´Ëµ¡£
¿ªÊ¼Ê±¼äµã
ÔÚ´´½¨Retrofit¶ÔÏóʱ£¬ÐèÒª OkHttpClient ¶ÔÏ󣬿ÉÒÔΪÆäÌí¼Ó Interceptor
½øÐÐÇëÇ󷢯ðǰ Request µÄÀ¹½Ø£¬ÎÒÃÇ¿ÉÒÔ¹¹½¨Ò»¸öÓÃÓڼǼÇëÇó¿ªÊ¼Ê±¼äµãµÄInterceptor£¬ÔÚ
OkHttpClient.Builder() µ÷ÓÃʱ£¬²åÈë¸Ã¶ÔÏó¡£
public Builder()
{
this.addInterceptor(new AutoSpeedRetrofitInterceptor());
...
} |
¶ø¸ÃInterceptor¶ÔÏó¾ÍÊÇÓÃÓÚÔÚÇëÇ󷢯ðǰ£¬½øÐÐÇëÇó¿ªÊ¼Ê±¼äµãµÄ¼Ç¼¡£
public class
AutoSpeedRetrofitInterceptor implements Interceptor
{
public Response intercept(Chain var1) throws IOException
{
AutoSpeed.getInstance().onApiLoadStart(var1.request() .url());
return var1.proceed(var1.request());
}
} |
½áÊøÊ±¼äµã
ʹÓÃRetrofit·¢ÆðÇëÇóʱ£¬ÎÒÃÇ»áµ÷ÓÃÆä enqueue() ·½·¨½øÐÐÒì²½ÇëÇó£¬Í¬Ê±´«ÈëÒ»¸ö Callback
½øÐлص÷£¬ÎÒÃÇ¿ÉÒÔ×Ô¶¨ÒåÒ»¸öCallback£¬ÓÃÓڼǼÇëÇó»ØÀ´ºóµÄʱ¼äµã£¬È»ºóÔÚenqueue·½·¨Öн«²ÎÊý»»Îª×Ô¶¨ÒåµÄCallback£¬¶øÔCallback×÷ΪÆä´úÀí¶ÔÏó¼´¿É¡£
public void
enqueue(Callback<T> callback) {
final Callback<T> callback = new AutoSpeedRetrofitCallback(callback);
...
} |
¸ÃCallback¶ÔÏóÓÃÓÚÔÚÇëÇó³É¹¦»òʧ°Ü»Øµ÷ʱ£¬¼Ç¼ÇëÇó½áÊøÊ±¼äµã£¬²¢µ÷ÓôúÀí¶ÔÏóµÄÏàÓ¦·½·¨´¦ÀíÔÓÐÂß¼¡£
public class
AutoSpeedRetrofitCallback implements Callback
{
private final Callback delegate;
public AutoSpeedRetrofitMtCallback(Callback var1)
{
this.delegate = var1;
}
public void onResponse(Call var1, Response var2)
{
AutoSpeed.getInstance().onApiLoadEnd(var1.request() .url());
this.delegate.onResponse(var1, var2);
}
public void onFailure(Call var1, Throwable var2)
{
AutoSpeed.getInstance().onApiLoadEnd(var1.request() .url());
this.delegate.onFailure(var1, var2);
}
} |
ʹÓÃRetrofit+RXJavaʱ£¬·¢ÆðÇëÇóʱÄÚ²¿Êǵ÷ÓÃµÄ execute() ·½·¨½øÐÐͬ²½ÇëÇó£¬ÎÒÃÇÖ»ÐèÒªÔÚÆäÖ´ÐÐǰºó²åÈë¼ÆËãʱ¼äµÄ´úÂë¼´¿É£¬´Ë´¦²»ÔÙ׸Êö¡£
ÒÉÄÑÔÓÖ¢
ÖÁ´Ë£¬ÎÒÃÇ»ù±¾µÄ²âËÙ¿ò¼ÜÒѾÍê³É£¬²»¹ý¾¹ýÎÒÃǵÄʵ¼ù·¢ÏÖ£¬ÓÐÒ»ÖÖÇé¿öϲâËÙÊý¾Ý»á·Ç³£²»×¼£¬ÄǾÍÊÇ¿ªÍ·Ìá¹ýµÄViewPager+Fragment²¢ÇÒʵÏÖÑÓ³Ù¼ÓÔØµÄÇé¿ö¡£ÕâÒ²ÊÇÒ»Öֺܳ£¼ûµÄÇé¿ö£¬Í¨³£ÊÇΪÁ˽ÚÊ¡¿ªÏú£¬ÔÚÇл»ViewPagerµÄTabʱ£¬²ÅÊ״ε÷ÓÃFragmentµÄ³õʼ¼ÓÔØ·½·¨½øÐÐÊý¾ÝÇëÇó¡£¾¹ýµ÷ÊÔ·ÖÎö£¬ÎÒÃÇÕÒµ½ÁËÎÊÌâµÄÔÒò¡£
µÈ´ýÇл»Ê±¼ä

¸Ãͼºìɫʱ¼ä¶Î·´Ó³³ö£¬Ö±µ½ViewPagerÇл»µ½Fragmentǰ£¬Fragment²»»á·¢ÆðÇëÇó£¬Õâ¶ÎµÈ´ýµÄʱ¼ä¾Í»áÑÓ³¤Õû¸öÒ³ÃæµÄ¼ÓÔØÊ±¼ä£¬µ«ÆäʵÕâ¿éʱ¼ä²»Ó¦¸ÃËãÔÚÄÚ£¬ÒòΪÕâ¶Îʱ¼äÊÇÓû§ÎÞ¸ÐÖªµÄ£¬²»ÄÜ×÷ÎªÒ³ÃæºÄʱ¹ý³¤µÄÒÀ¾Ý¡£
ÄÇôÈçºÎ½â¾öÄØ£¿ÎÒÃǶ¼ÖªµÀViewPagerµÄTabÇл»ÊÇ¿ÉÒÔͨ¹ýÒ»¸ö OnPageChangeListener
¶ÔÏó½øÐмàÌýµÄ£¬ËùÒÔÎÒÃÇ¿ÉÒÔΪViewPagerÌí¼ÓÒ»¸ö×Ô¶¨ÒåµÄListener¶ÔÏó£¬ÔÚÇл»Ê±¼Ç¼һ¸öʱ¼ä£¬ÕâÑù¿ÉÒÔͨ¹ýÓÃÕâ¸öʱ¼ä¼õÈ¥Ò³Ãæ´´½¨ºóµÄʱ¼äµÃ³öÕâ¸ö¶àÓàµÄµÈ´ýʱ¼ä£¬Éϱ¨Ê±ÔÚ×Üʱ¼äÖмõÈ¥¼´¿É¡£
public ViewPager(Context
context) {
...
this.addOnPageChangeListener(new AutoSpeedLazyLoadListener(this.mItems));
} |
mItems ÊÇViewPagerÖе±Ç°Ò³Ãæ¶ÔÏóµÄÊý×飬ÔÚListenerÖпÉÒÔͨ¹ýËûÕÒµ½¶ÔÓ¦µÄÒ³Ãæ£¬½øÐÐÇл»Ê±µÄÂñµã¡£
//AutoSpeedLazyLoadListener
public void onPageSelected(int var1) {
if(this.items != null) {
int var2 = this.items.size();
for(int var3 = 0; var3 < var2; ++var3) {
Object var4 = this.items.get(var3);
if(var4 instanceof ItemInfo) {
ItemInfo var5 = (ItemInfo)var4;
if(var5.position == var1 && var5.object
instanceof Fragment) {
AutoSpeed.getInstance().onPageSelect(var5.object);
break;
}
}
}
}
} |
AutoSpeedµÄ onPageSelected() ·½·¨¼ÇÂ¼Ò³ÃæµÄÇл»Ê±¼ä¡£ÕâÑùÒ»À´£¬ÔÚ¼ÆËãÒ³Ãæ¼ÓÔØËÙ¶È×Üʱ¼äʱ£¬¾ÍÒª¼õÈ¥ÕâÒ»¶Îʱ¼ä¡£
long getTotalTime()
{
if (createTime <= 0) {
return -1;
}
if (finalDrawEndTime > 0) {//Óжþ´ÎäÖȾʱ¼ä
long totalTime = finalDrawEndTime - createTime;
//Èç¹ûÓеȴýʱ¼ä£¬Ôò¼õµôÕâ¶Î¶àÓàµÄʱ¼ä
if (selectedTime > 0 && selectedTime
> viewCreatedTime && selectedTime <
finalDrawEndTime) {
totalTime -= (selectedTime - viewCreatedTime);
}
return totalTime;
} else {//ÒÔ³õ´ÎäÖȾʱ¼äΪÕûÌåʱ¼ä
return getInitialDrawTime();
}
}
|
ÕâÀï¼õÈ¥µÄ viewCreatedTime ²»ÊÇFragmentµÄ onCreate() ʱ¼ä£¬¶øÓ¦¸ÃÊÇ
onViewCreated() ʱ¼ä£¬ÒòΪ´ÓonCreateµ½onViewCreatedÖ®¼äµÄʱ¼äÒ²ÊÇÓ¦¸ÃËãÔÚÒ³Ãæ¼ÓÔØÊ±¼äÄÚ£¬²»Ó¦¸Ã¼õÈ¥£¬ËùÒÔΪÁË´¦ÀíÕâÖÖÇé¿ö£¬ÎÒÃÇ»¹ÐèÒª¶ÔFragmentµÄonViewCreated·½·¨½øÐÐÂñµã£¬Âñµã·½Ê½Í¬
onCreate() µÄÂñµã¡£
äÖȾʱ»ú²»¹Ì¶¨
´ËÍâ¾Êµ¼ù·¢ÏÖ£¬ÓÉÓÚ²»Í¬ViewÔÚ»æÖÆ×ÓViewʱµÄ»æÖÆÔÀí²»Ò»Ñù£¬ÓпÉÄܻᵼÖÂÒÔÏÂÇé¿öµÄ·¢Éú£º
* ûÓÐÇл»ÖÁFragmentʱ£¬FragmentµÄView³õ´ÎäÖȾÒѾÍê³É£¬¼´View²»¿É¼ûµÄÇé¿öÏÂÒ²µ÷ÓÃÁË
dispatchDraw()¡£
* ûÓÐÇл»ÖÁFragmentʱ£¬FragmentµÄView³õ´ÎäÖȾδÍê³É£¬¼´Ö±µ½View³õ´Î¿É¼ûʱ
dispatchDraw() ²Å»áµ÷Óá£
* ûÓÐÑÓ³Ù¼ÓÔØÊ±£¬µ±ViewPagerûÓÐÇл»µ½Fragment£¬¶øÊÇÖ±½Ó·¢ËÍÇëÇóºó£¬ÇëÇó»ØÀ´Ê±¸üÐÂView£¬»áµ÷ÓÃ
dispatchDraw() ½øÐжþ´ÎäÖȾ¡£
* ûÓÐÑÓ³Ù¼ÓÔØÊ±£¬µ±ViewPagerûÓÐÇл»µ½Fragment£¬¶øÊÇÖ±½Ó·¢ËÍÇëÇóºó£¬ÇëÇó»ØÀ´Ê±¸üÐÂView£¬²»»áµ÷ÓÃ
dispatchDraw() £¬¼´Ö±µ½Çл»µ½Fragmentʱ²Å»á½øÐжþ´ÎäÖȾ¡£
ÉÏÃæµÄÎÊÌâ×ܽáÀ´¿´£¬¾ÍÊdzõ´ÎäÖȾʱ¼äºÍ¶þ´ÎäÖȾʱ¼äÖУ¬¿ÉÄÜ»áÓиöµÈ´ýÇл»µÄʱ¼ä£¬µ¼ÖÂÕâÁ½¸öʱ¼ä±ä³¤£¬¶øÕâ¸öÇл»Ê±¼äµã²¢²»ÊÇ
onPageSelected() ·½·¨µ÷ÓõÄʱºò£¬ÒòΪ¸Ã·½·¨ÊÇÔÚFragmentÍêÈ«»¬¶¯³öÀ´Ö®ºó²Å»áµ÷Ó㬶øÕâ¸öÎÊÌâÀïµÄÇл»Ê±¼äµã£¬Ó¦¸ÃÊÇÖ¸View³õ´ÎչʾµÄʱºò£¬Ò²¾ÍÊǸÕÒ»»¬¶¯£¬ViewPager¶³öÄ¿±êViewµÄʱ¼äµã¡£ÓÚÊÇÀà±ÈÑÓ³Ù¼ÓÔØµÄÇл»Ê±¼ä£¬ÎÒÃÇÀûÓÃListenerµÄ
onPageScrolled() ·½·¨£¬ÔÚViewPager»¬¶¯Ê±£¬ÕÒµ½Ä¿±êÒ³Ãæ£¬ÎªÆä¼Ç¼һ¸ö»¬¶¯Ê±¼äµã
scrollToTime ¡£
public void
onPageScrolled(int var1, float var2, int var3)
{
if(this.items != null) {
int var4 = Math.round(var2);
int var5 = var2 != (float)0 && var4 !=
1?(var4 == 0?var1 + 1:-1):var1;
int var6 = this.items.size();
for(int var7 = 0; var7 < var6; ++var7) {
Object var8 = this.items.get(var7);
if(var8 instanceof ItemInfo) {
ItemInfo var9 = (ItemInfo)var8;
if(var9.position == var5 && var9.object
instanceof Fragment) {
AutoSpeed.getInstance().onPageScroll(var9.object);
break;
}
}
}
}
} |
ÄÇôÕâÑù¾Í¿ÉÒÔ½â¾öÁ½´ÎäÖȾµÄÎó²î£º
* ³õ´ÎäÖȾʱ¼äÖУ¬ scrollToTime - viewCreatedTime ¾ÍÊÇÒ³Ãæ´´½¨ºó£¬µ½³õ´ÎäÖȾ½áÊøÖ®¼ä£¬ÒòΪµÈ´ý¹ö¶¯¶ø²úÉúµÄ¶àÓàʱ¼ä¡£
* ¶þ´ÎäÖȾʱ¼äÖУ¬ scrollToTime - apiLoadEndTime ¾ÍÊÇÇëÇóÍê³Éºó£¬µ½¶þ´ÎäÖȾ½áÊøÖ®¼ä£¬ÒòΪµÈ´ý¹ö¶¯¶ø²úÉúµÄ¶àÓàʱ¼ä¡£
ÓÚÊÇÔÚ¼ÆËã³õ´ÎºÍ¶þ´ÎäÖȾʱ¼äʱ£¬¿ÉÒÔ¼õÈ¥¶àÓàʱ¼äµÃµ½ÕýÈ·µÄÖµ¡£
long getInitialDrawTime()
{
if (createTime <= 0 || initialDrawEndTime <=
0) {
return -1;
}
if (scrollToTime > 0 && scrollToTime
> viewCreatedTime && scrollToTime <=
initialDrawEndTime) {//ÑÓ³Ù³õ´ÎäÖȾ£¬ÐèÒª¼õÈ¥µÈ´ýµÄʱ¼ä(viewCreated->changeToPage)
return initialDrawEndTime - createTime - (scrollToTime
- viewCreatedTime);
} else {//Õý³£³õ´ÎäÖȾ
return initialDrawEndTime - createTime;
}
}
long getFinalDrawTime() {
if (finalDrawEndTime <= 0 || apiLoadEndTime
<= 0) {
return -1;
}
//ÑÓ³Ù¶þ´ÎäÖȾ£¬ÐèÒª¼õÈ¥µÈ´ýʱ¼ä(apiLoadEnd->scrollToTime)
if (scrollToTime > 0 && scrollToTime
> apiLoadEndTime && scrollToTime <=
finalDrawEndTime) {
return finalDrawEndTime - apiLoadEndTime - (scrollToTime
- apiLoadEndTime);
} else {//Õý³£¶þ´ÎäÖȾ
return finalDrawEndTime - apiLoadEndTime;
}
} |
×ܽá
ÒÔÉϾÍÊÇÎÒÃǶÔÒ³Ãæ²âËÙ¼°×Ô¶¯»¯ÊµÏÖÉÏ×öµÄһЩ³¢ÊÔ£¬Ä¿Ç°ÒѾÔÚÏîÄ¿ÖÐʹÓ㬲¢ÔÚ¼à¿ØÆ½Ì¨ÉÏ¿ÉÒÔ»ñȡʵʱµÄÊý¾Ý¡£ÎÒÃÇ¿ÉÒÔͨ¹ý·ÖÎöÊý¾ÝÀ´Á˽âÒ³ÃæµÄÐÔÄܽø¶ø×öÓÅ»¯£¬²»¶ÏÌáÉýÏîÄ¿µÄÕûÌåÖÊÁ¿¡£²¢ÇÒͨ¹ýʵ¼ù·¢ÏÖÁËһЩ²âËÙÎó²îµÄÎÊÌ⣬Ҳ¶¼ÖðÒ»½â¾ö£¬Ê¹µÃ²âËÙÊý¾Ý¸ü¼Ó¿É¿¿¡£×Ô¶¯»¯µÄʵÏÖÒ²ÈÃÎÒÃÇÔÚºóÐø¿ª·¢ÖеÄά»¤±äµÃ¸üÈÝÒ×£¬²»ÓÃά»¤Ò³Ãæ²âËÙÏà¹ØµÄÂß¼£¬¾Í¿ÉÒÔ×öµ½ÊµÊ±¼à²âËùÓÐÒ³ÃæµÄ¼ÓÔØËÙ¶È¡£
|