ÐòÑÔ
ÕâÊÇAndroidÐÔÄÜÓÅ»¯µä·¶µÚ5¼¾µÄ¿Î³Ìѧϰ±Ê¼Ç£¬ÍÏÍÏÀÀºÜ¾Ã£¬¼Ç¼·ÖÏí¸ø´ó¼Ò£¬Çë¶à¶à°üº¡¢µ£´ýÖ¸Õý£¡ÎÄÕ¹²ÓÐ10¸ö¶ÎÂ䣬ɿ¼°µÄÄÚÈÝÓУº¶àÏ̲߳¢·¢µÄÐÔÄÜÎÊÌ⣬½éÉÜÁËAsyncTask¡¢HandlerThread¡¢IntentServiceÓëThreadPool·Ö±ðÊʺϵÄʹÓó¡¾°ÒÔ¼°¸÷×ÔµÄʹÓÃ×¢ÒâÊÂÏî¡£ÕâÊÇһƪÁ˽âAndroid¶àÏ̱߳à³Ì²»¿É¶àµÃµÄ»ù´¡ÎÄÕ£¬Çå³þµØÁ˽âÕâЩAndroidϵͳÌṩµÄ¶àÏ̻߳ù´¡×é¼þÖ®¼äµÄ²îÒìÒÔ¼°ÓÅȱµã£¬²ÅÄܹ»ÔÚÏîĿʵսÖÐ×ö³ö×îÇ¡µ±µÄÑ¡Ôñ¡£
ϵÁÐÔĶÁ
AndroidÐÔÄÜÓÅ»¯µä·¶£¨Ò»£©£ºÖ÷Òª´ÓAndroidµÄäÖȾ»úÖÆ¡¢ÄÚ´æÓëGC¡¢µçÁ¿ÓÅ»¯Èý¸ö·½ÃæÕ¹¿ª£¬½éÉÜÁËAndroidÖÐÐÔÄÜÎÊÌâµÄµ×²ã¹¤×÷ÔÀí£¬ÒÔ¼°ÈçºÎͨ¹ý¹¤¾ßÀ´ÕÒ³öÐÔÄÜÎÊÌâ¼°ÌáÉýÐÔÄܵĽ¨Òé¡£
AndroidÐÔÄÜÓÅ»¯µä·¶£¨¶þ£©£º20¸ö¶ÌÊÓÆµ£¬Ö÷ÒªÄÚÈÝΪ£ºµçÁ¿ÓÅ»¯¡¢ÍøÂçÓÅ»¯¡¢Android WearÉÏÈçºÎ×öÓÅ»¯¡¢Ê¹ÓöÔÏó³ØÀ´Ìá¸ßЧÂÊ¡¢LRU Cache¡¢BitmapµÄËõ·Å¡¢»º´æ¡¢ÖØÓá¢PNGѹËõ¡¢×Ô¶¨ÒåViewµÄÐÔÄÜ¡¢ÌáÉýÉèÖÃalphaÖ®ºóViewµÄäÖȾÐÔÄÜ£¬ÒÔ¼°Lint¡¢StictModeµÈ¹¤¾ßµÄʹÓü¼ÇÉ¡£
AndroidÐÔÄÜÓÅ»¯µä·¶£¨Èý£©£º¸ü¸ßЧµÄArrayMapÈÝÆ÷£¬Ê¹ÓÃAndroidϵͳÌṩµÄÌØÊâÈÝÆ÷À´±ÜÃâ×Ô¶¯×°Ï䣬±ÜÃâʹÓÃö¾ÙÀàÐÍ£¬×¢ÒâonLowMemoryÓëonTrimMemoryµÄ»Øµ÷£¬±ÜÃâÄÚ´æÐ¹Â©£¬¸ßЧµÄλÖøüвÙ×÷£¬Öظ´layout²Ù×÷µÄÐÔÄÜÓ°Ï죬ÒÔ¼°Ê¹ÓÃBatching£¬PrefetchingÓÅ»¯ÍøÂçÇëÇó£¬Ñ¹Ëõ´«ÊäÊý¾ÝµÈʹÓü¼ÇÉ¡£
AndroidÐÔÄÜÓÅ»¯µä·¶£¨ËÄ£©£ºÓÅ»¯ÍøÂçÇëÇóµÄÐÐΪ£¬ÓÅ»¯°²×°°üµÄ×ÊÔ´Îļþ£¬ÓÅ»¯Êý¾Ý´«ÊäµÄЧÂÊ£¬ÐÔÄÜÓÅ»¯µÄ¼¸´ó»ù´¡ÔÀíµÈ¡£
1) Threading Performance
ÔÚ³ÌÐò¿ª·¢µÄʵ¼ùµ±ÖУ¬ÎªÁËÈóÌÐò±íÏֵøü¼ÓÁ÷³©£¬ÎÒÃǿ϶¨»áÐèҪʹÓõ½¶àÏß³ÌÀ´ÌáÉý³ÌÐòµÄ²¢·¢Ö´ÐÐÐÔÄÜ¡£µ«ÊDZàд¶àÏ̲߳¢·¢µÄ´úÂëÒ»Ö±ÒÔÀ´¶¼ÊÇÒ»¸öÏà¶Ô¼¬ÊÖµÄÎÊÌ⣬ËùÒÔÏëÒª»ñµÃ¸ü¼ÑµÄ³ÌÐòÐÔÄÜ£¬ÎÒÃǷdz£ÓбØÒªÕÆÎÕ¶àÏ̲߳¢·¢±à³ÌµÄ»ù´¡¼¼ÄÜ¡£
ÖÚËùÖÜÖª£¬Android³ÌÐòµÄ´ó¶àÊý´úÂë²Ù×÷¶¼±ØÐëÖ´ÐÐÔÚÖ÷Ị̈߳¬ÀýÈçϵͳʼþ(ÀýÈçÉ豸ÆÁÄ»·¢ÉúÐýת)£¬ÊäÈëʼþ(ÀýÈçÓû§µã»÷»¬¶¯µÈ)£¬³ÌÐò»Øµ÷·þÎñ£¬UI»æÖÆÒÔ¼°ÄÖÖÓʼþµÈµÈ¡£ÄÇôÎÒÃÇÔÚÉÏÊöʼþ»òÕß·½·¨ÖвåÈëµÄ´úÂëÒ²½«Ö´ÐÐÔÚÖ÷Ï̡߳£

Ò»µ©ÎÒÃÇÔÚÖ÷Ïß³ÌÀïÃæÌí¼ÓÁ˲Ù×÷¸´ÔӵĴúÂ룬ÕâЩ´úÂë¾ÍºÜ¿ÉÄÜ×è°Ö÷Ïß³ÌÈ¥ÏìÓ¦µã»÷/»¬¶¯Ê¼þ£¬×è°Ö÷Ï̵߳ÄUI»æÖƵȵȡ£ÎÒÃÇÖªµÀ£¬ÎªÁËÈÃÆÁÄ»µÄË¢ÐÂÖ¡ÂÊ´ïµ½60fps£¬ÐèҪȷ±£16msÄÚÍê³Éµ¥´ÎˢеIJÙ×÷¡£Ò»µ©ÎÒÃÇÔÚÖ÷Ïß³ÌÀïÃæÖ´ÐеÄÈÎÎñ¹ýÓÚ·±ÖؾͿÉÄܵ¼Ö½ÓÊÕµ½Ë¢ÐÂÐźŵÄʱºò£¬»áÒòΪ×ÊÔ´±»Õ¼ÓöøÎÞ·¨Íê³ÉÕâ´ÎˢвÙ×÷¡£Óɴ˵¼Ö²úÉúµôÖ¡µÄÏÖÏó£¬Ë¢ÐÂÖ¡ÂÊ×ÔȻҲ¾Í¸ú×ÅϽµÁË(Ò»µ©Ë¢ÐÂÖ¡Âʽµµ½20fps×óÓÒ£¬Óû§¾Í¿ÉÒÔÃ÷ÏÔ¸ÐÖªµ½¿¨¶Ù²»Á÷³©ÁË)¡£

ΪÁ˱ÜÃâÉÏÃæÌáµ½µÄµôÖ¡ÎÊÌ⣬ÎÒÃÇÐèҪʹÓöàÏ̵߳ļ¼Êõ·½°¸£¬°ÑÄÇЩ²Ù×÷¸´ÔÓµÄÈÎÎñÒÆ¶¯µ½ÆäËûÏ̵߳±ÖÐÖ´ÐУ¬ÕâÑù¾Í²»ÈÝÒ××èÈûÖ÷Ï̵߳IJÙ×÷£¬Ò²¾Í¼õСÁ˳öÏÖµôÖ¡µÄ¿ÉÄÜÐÔ¡£

ÄÇôÎÊÌâÀ´ÁË£¬ÎªÖ÷Ï̼߳õÇḺµÄ¶àÏ̷߳½°¸ÓÐÄÄÐ©ÄØ£¿ÕâЩ·½°¸·Ö±ðÊʺÏÔÚʲô³¡¾°ÏÂʹÓã¿AndroidϵͳΪÎÒÃÇÌṩÁËÈô¸É×鹤¾ßÀàÀ´°ïÖú½â¾öÕâ¸öÎÊÌâ¡£
AsyncTask: ΪUIÏß³ÌÓ빤×÷Ïß³ÌÖ®¼ä½øÐпìËÙµÄÇл»ÌṩһÖÖ¼òµ¥±ã½ÝµÄ»úÖÆ¡£ÊÊÓÃÓÚµ±ÏÂÁ¢¼´ÐèÒªÆô¶¯£¬µ«ÊÇÒì²½Ö´ÐеÄÉúÃüÖÜÆÚ¶ÌÔݵÄʹÓó¡¾°¡£
HandlerThread: ΪijЩ»Øµ÷·½·¨»òÕߵȴýijЩÈÎÎñµÄÖ´ÐÐÉèÖÃÒ»¸öרÊôµÄỊ̈߳¬²¢ÌṩÏß³ÌÈÎÎñµÄµ÷¶È»úÖÆ¡£
ThreadPool: °ÑÈÎÎñ·Ö½â³É²»Í¬µÄµ¥Ôª£¬·Ö·¢µ½¸÷¸ö²»Í¬µÄÏß³ÌÉÏ£¬½øÐÐͬʱ²¢·¢´¦Àí¡£
IntentService: ÊʺÏÓÚÖ´ÐÐÓÉUI´¥·¢µÄºǫ́ServiceÈÎÎñ£¬²¢¿ÉÒ԰Ѻǫ́ÈÎÎñÖ´ÐеÄÇé¿öͨ¹ýÒ»¶¨µÄ»úÖÆ·´À¡¸øUI¡£
Á˽âÕâЩϵͳÌṩµÄ¶àÏ̹߳¤¾ßÀà·Ö±ðÊʺÏÔÚʲô³¡¾°Ï£¬¿ÉÒÔ°ïÖúÎÒÃÇÑ¡ÔñºÏÊʵĽâ¾ö·½°¸£¬±ÜÃâ³öÏÖ²»¿ÉÔ¤ÆÚµÄÂé·³¡£ËäȻʹÓöàÏ߳̿ÉÒÔÌá¸ß³ÌÐòµÄ²¢·¢Á¿£¬µ«ÊÇÎÒÃÇÐèÒªÌØ±ð×¢ÒâÒòΪÒýÈë¶àÏ̶߳ø¿ÉÄܰéËæ¶øÀ´µÄÄÚ´æÎÊÌâ¡£¾Ù¸öÀý×Ó£¬ÔÚActivityÄÚ²¿¶¨ÒåµÄÒ»¸öAsyncTask£¬ËüÊôÓÚÒ»¸öÄÚ²¿À࣬¸ÃÀà±¾ÉíºÍÍâÃæµÄActivityÊÇÓÐÒýÓùØÏµµÄ£¬Èç¹ûActivityÒªÏú»ÙµÄʱºò£¬AsyncTask»¹ÈÔÈ»ÔÚÔËÐУ¬Õâ»áµ¼ÖÂActivityûÓа취ÍêÈ«ÊÍ·Å£¬´Ó¶øÒý·¢ÄÚ´æÐ¹Â©¡£ËùÒÔ˵£¬¶àÏß³ÌÊÇÌáÉý³ÌÐòÐÔÄܵÄÓÐЧÊÖ¶ÎÖ®Ò»£¬µ«ÊÇʹÓöàÏß³ÌÈ´ÐèҪʮ·Ö½÷É÷СÐÄ£¬Èç¹û²»Á˽ⱳºóµÄÖ´ÐлúÖÆÒÔ¼°Ê¹ÓõÄ×¢ÒâÊÂÏºÜ¿ÉÄÜÒýÆðÑÏÖØµÄÎÊÌâ¡£
2) Understanding Android Threading
ͨ³£À´Ëµ£¬Ò»¸öÏß³ÌÐèÒª¾ÀúÈý¸öÉúÃü½×¶Î£º¿ªÊ¼¡¢Ö´ÐС¢½áÊø¡£Ï̻߳áÔÚÈÎÎñÖ´ÐÐÍê±ÏÖ®ºó½áÊø£¬ÄÇôΪÁËÈ·±£Ï̵߳Ĵæ»î£¬ÎÒÃÇ»áÔÚÖ´Ðн׶θøÏ̸߳³Ó費ͬµÄÈÎÎñ£¬È»ºóÔÚÀïÃæÌí¼ÓÍ˳öµÄÌõ¼þ´Ó¶øÈ·±£ÈÎÎñÄܹ»Ö´ÐÐÍê±ÏºóÍ˳ö¡£

Ôںܶàʱºò£¬Ï̲߳»½ö½öÊÇÏßÐÔÖ´ÐÐһϵÁеÄÈÎÎñ¾Í½áÊøÄÇô¼òµ¥µÄ£¬ÎÒÃÇ»áÐèÒªÔö¼ÓÒ»¸öÈÎÎñ¶ÓÁУ¬ÈÃÏ̲߳»¶ÏµÄ´ÓÈÎÎñ¶ÓÁÐÖлñÈ¡ÈÎÎñÈ¥½øÐÐÖ´ÐУ¬ÁíÍâÎÒÃÇ»¹¿ÉÄÜÔÚÏß³ÌÖ´ÐеÄÈÎÎñ¹ý³ÌÖÐÓëÆäËûµÄÏ߳̽øÐÐÐ×÷¡£Èç¹ûÕâЩϸ½Ú¶¼½»¸øÎÒÃÇ×Ô¼ºÀ´´¦Àí£¬Õ⽫»áÊǼþ¼«Æä·±ËöÓÖÈÝÒ׳ö´íµÄÊÂÇé¡£

ËùÐÒµÄÊÇ£¬AndroidϵͳΪÎÒÃÇÌṩÁËLooper¡¢Handler¡¢MessageQueueÀ´°ïÖúʵÏÖÉÏÃæµÄÏß³ÌÈÎÎñÄ£ÐÍ£º
Looper: Äܹ»È·±£Ï̳߳ÖÐø´æ»î²¢ÇÒ¿ÉÒÔ²»¶ÏµÄ´ÓÈÎÎñ¶ÓÁÐÖлñÈ¡ÈÎÎñ²¢½øÐÐÖ´ÐС£

Handler: Äܹ»°ïÖúʵÏÖ¶ÓÁÐÈÎÎñµÄ¹ÜÀí£¬²»½ö½öÄܹ»°ÑÈÎÎñ²åÈëµ½¶ÓÁеÄÍ·²¿£¬Î²²¿£¬»¹¿ÉÒÔ°´ÕÕÒ»¶¨µÄʱ¼äÑÓ³ÙÀ´È·±£ÈÎÎñ´Ó¶ÓÁÐÖÐÄܹ»À´µÃ¼°±»È¡Ïûµô¡£

MessageQueue: ʹÓÃIntent£¬Message£¬Runnable×÷ΪÈÎÎñµÄÔØÌåÔÚ²»Í¬µÄÏß³ÌÖ®¼ä½øÐд«µÝ¡£

°ÑÉÏÃæÈý¸ö×é¼þ´ò°üµ½Ò»Æð½øÐÐÐ×÷£¬Õâ¾ÍÊÇHandlerThread£º

ÎÒÃÇÖªµÀ£¬µ±³ÌÐò±»Æô¶¯£¬ÏµÍ³»á°ïæ´´½¨½ø³ÌÒÔ¼°ÏàÓ¦µÄÖ÷Ị̈߳¬¶øÕâ¸öÖ÷Ïß³ÌÆäʵ¾ÍÊÇÒ»¸öHandlerThread¡£Õâ¸öÖ÷Ï̻߳áÐèÒª´¦Àíϵͳʼþ¡¢ÊäÈëʼþ¡¢ÏµÍ³»Øµ÷¡¢UI»æÖƵȵÈÈÎÎñ£¬ÎªÁ˱ÜÃâÖ÷Ïß³ÌÈÎÎñ¹ýÖØ£¬ÎÒÃǾͻáÐèÒª²»¶ÏµØ¿ªÆôÐµĹ¤×÷Ïß³ÌÀ´´¦ÀíÄÇЩ×ÓÈÎÎñ¡£
3) Memory & Threading
Ôö¼Ó²¢·¢µÄÏß³ÌÊý»áµ¼ÖÂÄÚ´æÏûºÄµÄÔö¼Ó£¬Æ½ºâºÃÕâÁ½ÕߵĹØÏµÊǷdz£ÖØÒªµÄ¡£ÎÒÃÇÖªµÀ£¬¶àÏ̲߳¢·¢·ÃÎÊͬһ¿éÄÚ´æÇøÓòÓпÉÄÜ´øÀ´ºÜ¶àÎÊÌ⣬ÀýÈç¶ÁдµÄȨÏÞÕù¶áÎÊÌ⣬ABAÎÊÌâµÈµÈ¡£ÎªÁ˽â¾öÕâЩÎÊÌ⣬ÎÒÃÇ»áÐèÒªÒýÈëËøµÄ¸ÅÄî¡£
ÔÚAndroidϵͳÖУ¬Ò²ÎÞ·¨±ÜÃâÒòΪ¶àÏ̵߳ÄÒýÈ룬¶øµ¼Ö³öÏÖÖîÈçÉÏÎÄÌáµ½µÄÖÖÖÖÎÊÌâ¡£Android UI¶ÔÏóµÄ´´½¨¡¢¸üС¢Ïú»ÙµÈµÈ²Ù×÷¶¼Ä¬ÈÏÊÇÖ´ÐÐÔÚÖ÷Ị̈߳¬µ«ÊÇÈç¹ûÎÒÃÇÔÚ·ÇÖ÷Ï̶߳ÔUI¶ÔÏó½øÐвÙ×÷£¬³ÌÐò½«¿ÉÄܳöÏÖÒì³£ÉõÖÁÊDZÀÀ£¡£

ÁíÍ⣬ÔÚ·ÇUIÏß³ÌÖÐÖ±½Ó³ÖÓÐUI¶ÔÏóµÄÒýÓÃÒ²ºÜ¿ÉÄܳöÏÖÎÊÌâ¡£ÀýÈçWorkÏß³ÌÖгÖÓÐij¸öUI¶ÔÏóµÄÒýÓã¬ÔÚWorkÏß³ÌÖ´ÐÐÍê±Ï֮ǰ£¬UI¶ÔÏóÔÚÖ÷Ïß³ÌÖб»´ÓViewHierarchyÖÐÒÆ³ýÁË£¬Õâ¸öʱºòUI¶ÔÏóµÄÈκÎÊôÐÔ¶¼ÒѾ²»ÔÙ¿ÉÓÃÁË£¬ÁíÍâ¶ÔÕâ¸öUI¶ÔÏóµÄ¸üвÙ×÷Ò²¶¼Ã»ÓÐÈκÎÒâÒåÁË£¬ÒòΪËüÒѾ´ÓViewHierarchyÖб»ÒƳý£¬²»ÔÙ»æÖƵ½»ÃæÉÏÁË¡£

²»½öÈç´Ë£¬View¶ÔÏó±¾Éí¶ÔËùÊôµÄActivityÊÇÓÐÒýÓùØÏµµÄ£¬Èç¹û¹¤×÷Ï̳߳ÖÐø±£ÓÐViewµÄÒýÓã¬Õâ¾Í¿ÉÄܵ¼ÖÂActivityÎÞ·¨ÍêÈ«ÊÍ·Å¡£³ýÁËÖ±½ÓÏÔʽµÄÒýÓùØÏµ¿ÉÄܵ¼ÖÂÄÚ´æÐ¹Â¶Ö®Í⣬ÎÒÃÇ»¹ÐèÒªÌØ±ðÁôÒâÒþʽµÄÒýÓùØÏµÒ²¿ÉÄܵ¼ÖÂй¶¡£ÀýÈçͨ³£ÎÒÃǻῴµ½ÔÚActivityÀïÃæ¶¨ÒåµÄÒ»¸öAsyncTask£¬ÕâÖÖÀàÐ͵ÄAsyncTaskÓëÍⲿµÄActivityÊÇ´æÔÚÒþʽÒýÓùØÏµµÄ£¬Ö»ÒªTaskûÓнáÊø£¬ÒýÓùØÏµ¾Í»áÒ»Ö±´æÔÚ£¬ÕâºÜÈÝÒ×µ¼ÖÂActivityµÄй©¡£¸üÔã¸âµÄÇé¿öÊÇ£¬Ëü²»½ö½ö·¢ÉúÁËÄÚ´æÐ¹Â©£¬»¹¿ÉÄܵ¼Ö³ÌÐòÒì³£»òÕß±ÀÀ£¡£

ΪÁ˽â¾öÉÏÃæµÄÎÊÌ⣬ÎÒÃÇÐèÒª½÷¼ÇµÄÔÔò¾ÍÊÇ£º²»ÒªÔÚÈκηÇUIÏß³ÌÀïÃæÈ¥³ÖÓÐUI¶ÔÏóµÄÒýÓá£ÏµÍ³ÎªÁËÈ·±£ËùÓеÄUI¶ÔÏó¶¼Ö»»á±»UIÏß³ÌËù½øÐд´½¨£¬¸üУ¬Ïú»ÙµÄ²Ù×÷£¬ÌصØÉè¼ÆÁ˶ÔÓ¦µÄ¹¤×÷»úÖÆ(µ±Activity±»Ïú»ÙµÄʱºò£¬ÓɸÃActivityËù´¥·¢µÄ·ÇUIÏ̶߳¼½«ÎÞ·¨¶ÔUI¶ÔÏó½øÐвÙ×÷£¬·ñÕ߾ͻáÅ׳ö³ÌÐòÖ´ÐÐÒì³£µÄ´íÎó)À´·ÀÖ¹UI¶ÔÏó±»´íÎóµÄʹÓá£
4) Good AsyncTask Hunting
AsyncTaskÊÇÒ»¸öÈÃÈ˼Ȱ®ÓÖºÞµÄ×é¼þ£¬ËüÌṩÁËÒ»ÖÖ¼ò±ãµÄÒì²½´¦Àí»úÖÆ£¬µ«ÊÇËüÓÖͬʱÒýÈëÁËһЩÁîÈËÑá¶ñµÄÂé·³¡£Ò»µ©¶ÔAsyncTaskʹÓò»µ±£¬ºÜ¿ÉÄܶԳÌÐòµÄÐÔÄÜ´øÀ´¸ºÃæÓ°Ï죬ͬʱ»¹¿ÉÄܵ¼ÖÂÄÚ´æÐ¹Â¶¡£
¾Ù¸öÀý×Ó£¬³£Óöµ½µÄÒ»¸öµäÐ͵ÄʹÓó¡¾°£ºÓû§Çл»µ½Ä³¸ö½çÃæ£¬´¥·¢Á˽çÃæÉϵÄͼƬµÄ¼ÓÔØ²Ù×÷£¬ÒòΪͼƬµÄ¼ÓÔØÏà¶ÔÀ´ËµºÄʱ±È½Ï³¤£¬ÎÒÃÇÐèÒªÔÚ×ÓÏß³ÌÖд¦ÀíͼƬµÄ¼ÓÔØ£¬µ±Í¼Æ¬ÔÚ×ÓÏß³ÌÖд¦ÀíÍê³ÉÖ®ºó£¬ÔÙ°Ñ´¦ÀíºÃµÄͼƬ·µ»Ø¸øÖ÷Ị̈߳¬½»¸øUI¸üе½»ÃæÉÏ¡£

AsyncTaskµÄ³öÏÖ¾ÍÊÇΪÁË¿ìËÙµÄʵÏÖÉÏÃæµÄʹÓó¡¾°£¬AsyncTask°ÑÔÚÖ÷Ïß³ÌÀïÃæµÄ×¼±¸¹¤×÷·Åµ½onPreExecute()·½·¨ÀïÃæ½øÐÐÖ´ÐУ¬doInBackground()·½·¨Ö´ÐÐÔÚ¹¤×÷Ïß³ÌÖУ¬ÓÃÀ´´¦ÀíÄÇЩ·±ÖصÄÈÎÎñ£¬Ò»µ©ÈÎÎñÖ´ÐÐÍê±Ï£¬¾Í»áµ÷ÓÃonPostExecute()·½·¨·µ»Øµ½Ö÷Ï̡߳£

ʹÓÃAsyncTaskÐèҪעÒâµÄÎÊÌâÓÐÄÄÐ©ÄØ£¿Çë¹Ø×¢ÒÔϼ¸µã£º
Ê×ÏÈ£¬Ä¬ÈÏÇé¿öÏ£¬ËùÓеÄAsyncTaskÈÎÎñ¶¼ÊDZ»ÏßÐÔµ÷¶ÈÖ´Ðеģ¬ËûÃÇ´¦ÔÚͬһ¸öÈÎÎñ¶ÓÁе±ÖУ¬°´Ë³ÐòÖð¸öÖ´ÐС£¼ÙÉèÄã°´ÕÕ˳ÐòÆô¶¯20¸öAsyncTask£¬Ò»µ©ÆäÖеÄij¸öAsyncTaskÖ´ÐÐʱ¼ä¹ý³¤£¬¶ÓÁÐÖÐµÄÆäËûÊ£ÓàAsyncTask¶¼´¦ÓÚ×èÈû״̬£¬±ØÐëµÈµ½¸ÃÈÎÎñÖ´ÐÐÍê±ÏÖ®ºó²ÅÄܹ»Óлú»áÖ´ÐÐÏÂÒ»¸öÈÎÎñ¡£Çé¿öÈçÏÂͼËùʾ£º

ΪÁ˽â¾öÉÏÃæÌáµ½µÄÏßÐÔ¶ÓÁеȴýµÄÎÊÌ⣬ÎÒÃÇ¿ÉÒÔʹÓÃAsyncTask.executeOnExecutor()Ç¿ÖÆÖ¸¶¨AsyncTaskʹÓÃÏ̳߳ز¢·¢µ÷¶ÈÈÎÎñ¡£

Æä´Î£¬ÈçºÎ²ÅÄܹ»ÕæÕýµÄÈ¡ÏûÒ»¸öAsyncTaskµÄÖ´ÐÐÄØ£¿ÎÒÃÇÖªµÀAsyncTaksÓÐÌṩcancel()µÄ·½·¨£¬µ«ÊÇÕâ¸ö·½·¨Êµ¼ÊÉÏ×öÁËʲôÊÂÇéÄØ£¿Ï̱߳¾Éí²¢²»¾ß±¸ÖÐÖ¹ÕýÔÚÖ´ÐеĴúÂëµÄÄÜÁ¦£¬ÎªÁËÄܹ»ÈÃÒ»¸öÏ̸߳üÔçµÄ±»Ïú»Ù£¬ÎÒÃÇÐèÒªÔÚdoInBackground()µÄ´úÂëÖв»¶ÏµÄÌí¼Ó³ÌÐòÊÇ·ñ±»ÖÐÖ¹µÄÅжÏÂß¼£¬ÈçÏÂͼËùʾ£º

Ò»µ©ÈÎÎñ±»³É¹¦ÖÐÖ¹£¬AsyncTask¾Í²»»á¼ÌÐøµ÷ÓÃonPostExecute()£¬¶øÊÇͨ¹ýµ÷ÓÃonCancelled()µÄ»Øµ÷·½·¨·´À¡ÈÎÎñÖ´ÐÐÈ¡ÏûµÄ½á¹û¡£ÎÒÃÇ¿ÉÒÔ¸ù¾ÝÈÎÎñ»Øµ÷µ½Äĸö·½·¨£¨ÊÇonPostExecute»¹ÊÇonCancelled£©À´¾ö¶¨ÊǶÔUI½øÐÐÕý³£µÄ¸üл¹ÊǰѶÔÓ¦µÄÈÎÎñËùÕ¼ÓõÄÄÚ´æ½øÐÐÏú»ÙµÈ¡£
×îºó£¬Ê¹ÓÃAsyncTaskºÜÈÝÒ×µ¼ÖÂÄÚ´æÐ¹Â©£¬Ò»µ©°ÑAsyncTaskд³ÉActivityµÄÄÚ²¿ÀàµÄÐÎʽ¾ÍºÜÈÝÒ×ÒòΪAsyncTaskÉúÃüÖÜÆÚµÄ²»È·¶¨¶øµ¼ÖÂActivity·¢Éúй©¡£

×ÛÉÏËùÊö£¬AsyncTaskËäÈ»ÌṩÁËÒ»ÖÖ¼òµ¥±ã½ÝµÄÒì²½»úÖÆ£¬µ«ÊÇÎÒÃÇ»¹ÊǺÜÓбØÒªÌرð¹Ø×¢µ½ËûµÄȱµã£¬±ÜÃâ³öÏÖÒòΪʹÓôíÎó¶øµ¼ÖµÄÑÏÖØÏµÍ³ÐÔÄÜÎÊÌâ¡£
5£© Getting a HandlerThread
´ó¶àÊýÇé¿öÏ£¬AsyncTask¶¼Äܹ»Âú×ã¶àÏ̲߳¢·¢µÄ³¡¾°ÐèÒª£¨ÔÚ¹¤×÷Ïß³ÌÖ´ÐÐÈÎÎñ²¢·µ»Ø½á¹ûµ½Ö÷Ị̈߳©£¬µ«ÊÇËü²¢²»ÊÇÍòÄܵġ£ÀýÈç´ò¿ªÏà»úÖ®ºóµÄÔ¤ÀÀÖ¡Êý¾ÝÊÇͨ¹ýonPreviewFrame()µÄ·½·¨½øÐлص÷µÄ£¬onPreviewFrame()ºÍopen()Ïà»úµÄ·½·¨ÊÇÖ´ÐÐÔÚͬһ¸öÏ̵߳ġ£

Èç¹ûÕâ¸ö»Øµ÷·½·¨Ö´ÐÐÔÚUIỊ̈߳¬ÄÇôÔÚonPreviewFrame()ÀïÃæ½«ÒªÖ´ÐеÄÊý¾Ýת»»²Ù×÷½«ºÍÖ÷Ï̵߳ĽçÃæ»æÖÆ£¬Ê¼þ´«µÝµÈ²Ù×÷ÕùÇÀϵͳ×ÊÔ´£¬Õâ¾ÍÓпÉÄÜÓ°Ïìµ½Ö÷½çÃæµÄ±íÏÖÐÔÄÜ¡£

ÎÒÃÇÐèҪȷ±£onPreviewFrame()Ö´ÐÐÔÚ¹¤×÷Ï̡߳£Èç¹ûʹÓÃAsyncTask£¬»áÒòΪAsyncTaskĬÈϵÄÏßÐÔÖ´ÐеÄÌØÐÔ(¼´Ê¹»»³É²¢·¢Ö´ÐÐ)»áµ¼ÖÂÒòΪÎÞ·¨°ÑÈÎÎñ¼°Ê±´«µÝ¸ø¹¤×÷Ï̶߳øµ¼ÖÂÈÎÎñÔÚÖ÷Ïß³ÌÖб»ÑÓ³Ù£¬Ö±µ½¹¤×÷Ï߳̿ÕÏУ¬²Å¿ÉÒÔ°ÑÈÎÎñÇл»µ½¹¤×÷Ïß³ÌÖнøÐÐÖ´ÐС£

ËùÒÔÎÒÃÇÐèÒªµÄÊÇÒ»¸öÖ´ÐÐÔÚ¹¤×÷Ị̈߳¬Í¬Ê±ÓÖÄܹ»´¦Àí¶ÓÁÐÖеĸ´ÔÓÈÎÎñµÄ¹¦ÄÜ£¬¶øHandlerThreadµÄ³öÏÖ¾ÍÊÇΪÁËʵÏÖÕâ¸ö¹¦Äܵģ¬Ëü×éºÏÁËHandler£¬MessageQueue£¬LooperʵÏÖÁËÒ»¸ö³¤Ê±¼äÔËÐеÄỊ̈߳¬²»¶ÏµÄ´Ó¶ÓÁÐÖлñÈ¡ÈÎÎñ½øÐÐÖ´ÐеŦÄÜ¡£

»Øµ½¸Õ²ÅµÄ´¦ÀíÏà»ú»Øµ÷Êý¾ÝµÄÀý×Ó£¬Ê¹ÓÃHandlerThreadÎÒÃÇ¿ÉÒÔ°Ñopen()²Ù×÷ÓëonPreviewFrame()µÄ²Ù×÷Ö´ÐÐÔÚͬһ¸öỊ̈߳¬Í¬Ê±»¹±ÜÃâÁËAsyncTaskµÄ±×¶Ë¡£Èç¹ûÐèÒªÔÚonPreviewFrame()ÀïÃæ¸üÐÂUI£¬Ö»ÐèÒªµ÷ÓÃrunOnUiThread()·½·¨°ÑÈÎÎñ»Øµ÷¸øÖ÷Ï߳̾͹»ÁË¡£

HandlerThread±È½ÏºÏÊÊ´¦ÀíÄÇЩÔÚ¹¤×÷Ïß³ÌÖ´ÐУ¬ÐèÒª»¨·Ñʱ¼äÆ«³¤µÄÈÎÎñ¡£ÎÒÃÇÖ»ÐèÒª°ÑÈÎÎñ·¢Ë͸øHandlerThread£¬È»ºó¾ÍÖ»ÐèÒªµÈ´ýÈÎÎñÖ´ÐнáÊøµÄʱºò֪ͨ·µ»Øµ½Ö÷Ï߳̾ͺÃÁË¡£
ÁíÍâºÜÖØÒªµÄÒ»µãÊÇ£¬Ò»µ©ÎÒÃÇʹÓÃÁËHandlerThread£¬ÐèÒªÌØ±ð×¢Òâ¸øHandlerThreadÉèÖò»Í¬µÄÏß³ÌÓÅÏȼ¶£¬CPU»á¸ù¾ÝÉèÖõIJ»Í¬Ïß³ÌÓÅÏȼ¶¶ÔËùÓеÄÏ߳̽øÐе÷¶ÈÓÅ»¯¡£

ÕÆÎÕHandlerThreadÓëAsyncTaskÖ®¼äµÄÓÅȱµã£¬¿ÉÒÔ°ïÖúÎÒÃÇÑ¡ÔñºÏÊʵķ½°¸¡£
6£© Swimming in Threadpools
Ï̳߳ØÊʺÏÓÃÔÚ°ÑÈÎÎñ½øÐзֽ⣬²¢·¢½øÐÐÖ´Ðеij¡¾°¡£Í¨³£À´Ëµ£¬ÏµÍ³ÀïÃæ»áÕë¶Ô²»Í¬µÄÈÎÎñÉèÖÃÒ»¸öµ¥¶ÀµÄÊØ»¤Ïß³ÌÓÃÀ´×¨ÃÅ´¦ÀíÕâÏîÈÎÎñ¡£ÀýÈçʹÓÃNetworking ThreadÓÃÀ´×¨ÃÅ´¦ÀíÍøÂçÇëÇóµÄ²Ù×÷£¬Ê¹ÓÃIO ThreadÓÃÀ´×¨ÃÅ´¦ÀíϵͳµÄI\O²Ù×÷¡£Õë¶ÔÄÇЩ³¡¾°£¬ÕâÑùÉè¼ÆÊÇûÓÐÎÊÌâµÄ£¬ÒòΪ¶ÔÓ¦µÄÈÎÎñµ¥´ÎÖ´ÐеÄʱ¼ä²¢²»³¤¶øÇÒ¿ÉÒÔÊÇ˳ÐòÖ´Ðеġ£µ«ÊÇÕâÖÖרÊôµÄµ¥Ï̲߳¢²»ÄÜÂú×ãËùÓеÄÇé¿ö£¬ÀýÈçÎÒÃÇÐèÒªÒ»´ÎÐÔdecode 40ÕÅͼƬ£¬Ã¿¸öÏß³ÌÐèÒªÖ´ÐÐ4msµÄʱ¼ä£¬Èç¹ûÎÒÃÇʹÓÃרÊôµ¥Ï̵߳ķ½°¸£¬ËùÓÐͼƬִÐÐÍê±Ï»áÐèÒª»¨·Ñ160ms(40*4)£¬µ«ÊÇÈç¹ûÎÒÃÇ´´½¨10¸öỊ̈߳¬Ã¿¸öÏß³ÌÖ´ÐÐ4¸öÈÎÎñ£¬ÄÇôÎÒÃǾÍÖ»ÐèÒª16ms¾ÍÄܹ»°ÑËùÓеÄͼƬ´¦ÀíÍê±Ï¡£

ΪÁËÄܹ»ÊµÏÖÉÏÃæµÄÏ̳߳ØÄ£ÐÍ£¬ÏµÍ³ÎªÎÒÃÇÌṩÁËThreadPoolExecutor°ïÖúÀàÀ´¼ò»¯ÊµÏÖ£¬Ê£ÏÂÐèÒª×öµÄ¾ÍÖ»ÊǶÔÈÎÎñ½øÐзֽâ¾ÍºÃÁË¡£

ʹÓÃÏ̳߳ØÐèÒªÌØ±ð×¢Òâͬʱ²¢·¢Ïß³ÌÊýÁ¿µÄ¿ØÖÆ£¬ÀíÂÛÉÏÀ´Ëµ£¬ÎÒÃÇ¿ÉÒÔÉèÖÃÈÎÒâÄãÏëÒªµÄ²¢·¢ÊýÁ¿£¬µ«ÊÇÕâÑù×ö·Ç³£µÄ²»ºÃ¡£ÒòΪCPUÖ»ÄÜͬʱִÐй̶¨ÊýÁ¿µÄÏß³ÌÊý£¬Ò»µ©Í¬Ê±²¢·¢µÄÏß³ÌÊýÁ¿³¬¹ýCPUÄܹ»Í¬Ê±Ö´ÐеÄãÐÖµ£¬CPU¾ÍÐèÒª»¨·Ñ¾«Á¦À´Åжϵ½µ×ÄÄЩÏ̵߳ÄÓÅÏȼ¶±È½Ï¸ß£¬ÐèÒªÔÚ²»Í¬µÄÏß³ÌÖ®¼ä½øÐе÷¶ÈÇл»¡£

Ò»µ©Í¬Ê±²¢·¢µÄÏß³ÌÊýÁ¿´ïµ½Ò»¶¨µÄÁ¿¼¶£¬Õâ¸öʱºòCPUÔÚ²»Í¬Ïß³ÌÖ®¼ä½øÐе÷¶ÈµÄʱ¼ä¾Í¿ÉÄܹý³¤£¬·´¶øµ¼ÖÂÐÔÄÜÑÏÖØÏ½µ¡£ÁíÍâÐèÒª¹Ø×¢µÄÒ»µãÊÇ£¬Ã¿¿ªÒ»¸öеÄỊ̈߳¬¶¼»áºÄ·ÑÖÁÉÙ64K+µÄÄڴ档ΪÁËÄܹ»·½±ãµÄ¶ÔÏß³ÌÊýÁ¿½øÐпØÖÆ£¬ThreadPoolExecutorΪÎÒÃÇÌṩÁ˳õʼ»¯µÄ²¢·¢Ïß³ÌÊýÁ¿£¬ÒÔ¼°×î´óµÄ²¢·¢ÊýÁ¿½øÐÐÉèÖá£

ÁíÍâÐèÒª¹Ø×¢µÄÒ»¸öÎÊÌâÊÇ£ºRuntime.getRuntime().availableProcesser()·½·¨²¢²»¿É¿¿£¬Ëû·µ»ØµÄÖµ²¢²»ÊÇÕæÊµµÄCPUºËÐÄÊý£¬ÒòΪCPU»áÔÚijЩÇé¿öÏÂÑ¡Ôñ¶Ô²¿·ÖºËÐĽøÐÐ˯Ãß´¦Àí£¬ÔÚÕâÖÖÇé¿öÏ£¬·µ»ØµÄÊýÁ¿¾ÍÖ»ÄÜÊǼ¤»îµÄCPUºËÐÄÊý¡£
7£© The Zen of IntentService
ĬÈϵÄServiceÊÇÖ´ÐÐÔÚÖ÷Ï̵߳ģ¬¿ÉÊÇͨ³£Çé¿öÏ£¬ÕâºÜÈÝÒ×Ó°Ïìµ½³ÌÐòµÄ»æÖÆÐÔÄÜ(ÇÀÕ¼ÁËÖ÷Ï̵߳Ä×ÊÔ´)¡£³ýÁËÇ°Ãæ½éÉܹýµÄAsyncTaskÓëHandlerThread£¬ÎÒÃÇ»¹¿ÉÒÔÑ¡ÔñʹÓÃIntentServiceÀ´ÊµÏÖÒì²½²Ù×÷¡£IntentService¼Ì³Ð×ÔÆÕͨServiceͬʱÓÖÔÚÄÚ²¿´´½¨ÁËÒ»¸öHandlerThread£¬ÔÚonHandlerIntent()µÄ»Øµ÷ÀïÃæ´¦ÀíÈÓµ½IntentServiceµÄÈÎÎñ¡£ËùÒÔIntentService¾Í²»½ö½ö¾ß±¸ÁËÒì²½Ï̵߳ÄÌØÐÔ£¬»¹Í¬Ê±±£ÁôÁËService²»ÊÜÖ÷Ò³ÃæÉúÃüÖÜÆÚÓ°ÏìµÄÌØµã¡£

Èç´ËÒ»À´£¬ÎÒÃÇ¿ÉÒÔÔÚIntentServiceÀïÃæÍ¨¹ýÉèÖÃÄÖÖÓ¼ä¸ôÐԵĴ¥·¢Òì²½ÈÎÎñ£¬ÀýÈçË¢ÐÂÊý¾Ý£¬¸üлº´æµÄͼƬ»òÕßÊÇ·ÖÎöÓû§²Ù×÷ÐÐΪµÈµÈ£¬µ±È»´¦ÀíÕâЩÈÎÎñÐèҪСÐĽ÷É÷¡£
ʹÓÃIntentServiceÐèÒªÌØ±ðÁôÒâÒÔϼ¸µã£º
Ê×ÏÈ£¬ÒòΪIntentServiceÄÚÖõÄÊÇHandlerThread×÷ΪÒì²½Ị̈߳¬ËùÒÔÿһ¸ö½»¸øIntentServiceµÄÈÎÎñ¶¼½«ÒÔ¶ÓÁеķ½Ê½Öð¸ö±»Ö´Ðе½£¬Ò»µ©¶ÓÁÐÖÐÓÐij¸öÈÎÎñÖ´ÐÐʱ¼ä¹ý³¤£¬ÄÇô¾Í»áµ¼ÖºóÐøµÄÈÎÎñ¶¼»á±»ÑÓ³Ù´¦Àí¡£
Æä´Î£¬Í¨³£Ê¹Óõ½IntentServiceµÄʱºò£¬ÎÒÃÇ»á½áºÏʹÓÃBroadcastReceiver°Ñ¹¤×÷Ï̵߳ÄÈÎÎñÖ´Ðнá¹û·µ»Ø¸øÖ÷UIÏ̡߳£Ê¹Óù㲥ÈÝÒ×ÒýÆðÐÔÄÜÎÊÌ⣬ÎÒÃÇ¿ÉÒÔʹÓÃLocalBroadcastManagerÀ´·¢ËÍÖ»ÔÚ³ÌÐòÄÚ²¿´«µÝµÄ¹ã²¥£¬´Ó¶øÌáÉý¹ã²¥µÄÐÔÄÜ¡£ÎÒÃÇÒ²¿ÉÒÔʹÓÃrunOnUiThread()¿ìËٻص÷µ½Ö÷UIÏ̡߳£
×îºó£¬°üº¬ÕýÔÚÔËÐеÄIntentServiceµÄ³ÌÐòÏà±ÈÆð´¿´âµÄºǫ́³ÌÐò¸ü²»ÈÝÒ×±»ÏµÍ³É±ËÀ£¬¸Ã³ÌÐòµÄÓÅÏȼ¶ÊǽéÓÚǰ̨³ÌÐòÓë´¿ºǫ́³ÌÐòÖ®¼äµÄ¡£
8£© Threading and Loaders
µ±Æô¶¯¹¤×÷Ï̵߳ÄActivity±»Ïú»ÙµÄʱºò£¬ÎÒÃÇÓ¦¸Ã×öµãÊ²Ã´ÄØ£¿ÎªÁË·½±ãµÄ¿ØÖƹ¤×÷Ïß³ÌµÄÆô¶¯Óë½áÊø£¬AndroidΪÎÒÃÇÒýÈëÁËLoaderÀ´½â¾öÕâ¸öÎÊÌâ¡£ÎÒÃÇÖªµÀActivityÓпÉÄÜÒòΪÓû§µÄÖ÷¶¯Çл»¶øÆµ·±µÄ±»´´½¨ÓëÏú»Ù£¬Ò²ÓпÉÄÜÊÇÒòΪÀàËÆÆÁÄ»·¢ÉúÐýתµÈ±»¶¯ÔÒò¶øÏú»ÙÔÙÖØ½¨¡£ÔÚActivity²»Í£µÄ´´½¨ÓëÏú»ÙµÄ¹ý³Ìµ±ÖУ¬ºÜÓпÉÄÜÒòΪ¹¤×÷Ï̳߳ÖÓÐActivityµÄView¶øµ¼ÖÂÄÚ´æÐ¹Â©(ÒòΪ¹¤×÷Ï̺߳ܿÉÄܳÖÓÐViewµÄÇ¿ÒýÓã¬ÁíÍ⹤×÷Ï̵߳ÄÉúÃüÖÜÆÚ»¹ÎÞ·¨±£Ö¤ºÍActivityµÄÉúÃüÖÜÆÚÒ»Ö£¬ÕâÑù¾ÍÈÝÒ×·¢ÉúÄÚ´æÐ¹Â©ÁË)¡£³ýÁË¿ÉÄÜÒýÆðÄÚ´æÐ¹Â©Ö®Í⣬ÔÚActivity±»Ïú»ÙÖ®ºó£¬¹¤×÷Ï̻߳¹¼ÌÐø¸üÐÂÊÓͼÊÇûÓÐÒâÒåµÄ£¬ÒòΪ´ËʱÊÓͼÒѾ²»ÔÚ½çÃæÉÏÏÔʾÁË¡£

LoaderµÄ³öÏÖ¾ÍÊÇΪÁËÈ·±£¹¤×÷Ïß³ÌÄܹ»ºÍActivityµÄÉúÃüÖÜÆÚ±£³ÖÒ»Ö£¬Í¬Ê±±ÜÃâ³öÏÖÇ°ÃæÌáµ½µÄÎÊÌâ¡£

LoaderManager»á¶Ô²éѯµÄ²Ù×÷½øÐлº´æ£¬Ö»Òª¶ÔÓ¦CursorÉϵÄÊý¾ÝԴûÓз¢Éú±ä»¯£¬ÔÚÅäÖÃÐÅÏ¢·¢Éú¸Ä±äµÄʱºò(ÀýÈçÆÁÄ»µÄÐýת)£¬Loader¿ÉÒÔÖ±½Ó°Ñ»º´æµÄÊý¾Ý»Øµ÷µ½onLoadFinished()£¬´Ó¶ø±ÜÃâÖØÐ²éѯÊý¾Ý¡£ÁíÍâϵͳ»áÔÚLoader²»ÔÙÐèҪʹÓõ½µÄʱºò(ÀýÈçʹÓÃBack°´Å¥Í˳öµ±Ç°Ò³Ãæ)»Øµ÷onLoaderReset()·½·¨£¬ÎÒÃÇ¿ÉÒÔÔÚÕâÀï×öÊý¾ÝµÄÇå³ýµÈµÈ²Ù×÷¡£
ÔÚActivity»òÕßFragmentÖÐʹÓÃLoader¿ÉÒÔ·½±ãµÄʵÏÖÒì²½¼ÓÔØµÄ¿ò¼Ü£¬LoaderÓÐÖî¶àÓŵ㡣µ«ÊÇʵÏÖLoaderµÄÕâÌ×´úÂ뻹ÊÇÉÔ΢Óеãµã¸´ÔÓ£¬Android¹Ù·½ÎªÎÒÃÇÌṩÁËʹÓÃLoaderµÄʾÀý´úÂë½øÐвο¼Ñ§Ï°¡£
9£© The Importance of Thread Priority
ÀíÂÛÉÏÀ´Ëµ£¬ÎÒÃǵijÌÐò¿ÉÒÔ´´½¨³ö·Ç³£¶àµÄ×ÓÏß³ÌÒ»Æð²¢·¢Ö´Ðеģ¬¿ÉÊÇ»ùÓÚCPUʱ¼äƬÂÖתµ÷¶ÈµÄ»úÖÆ£¬²»¿ÉÄÜËùÓеÄÏ̶߳¼¿ÉÒÔͬʱ±»µ÷¶ÈÖ´ÐУ¬CPUÐèÒª¸ù¾ÝÏ̵߳ÄÓÅÏȼ¶¸³Ó費ͬµÄʱ¼äƬ¡£

Androidϵͳ»á¸ù¾Ýµ±Ç°ÔËÐеĿɼûµÄ³ÌÐòºÍ²»¿É¼ûµÄºǫ́³ÌÐò¶ÔÏ߳̽øÐйéÀ࣬»®·ÖΪforgroundµÄÄDz¿·ÖÏ̻߳á´óÖÂÕ¼ÓõôCPUµÄ90%×óÓÒµÄʱ¼äƬ£¬backgroundµÄÄDz¿·ÖÏ߳̾Í×ܹ²Ö»ÄÜ·ÖÏíµ½5%-10%×óÓÒµÄʱ¼äƬ¡£Ö®ËùÒÔÉè¼Æ³ÉÕâÑùÊÇÒòΪforgroundµÄ³ÌÐò±¾ÉíµÄÓÅÏȼ¶¾Í¸ü¸ß£¬ÀíÓ¦µÃµ½¸ü¶àµÄÖ´ÐÐʱ¼ä¡£

ĬÈÏÇé¿öÏ£¬Ð´´½¨µÄÏ̵߳ÄÓÅÏȼ¶Ä¬ÈϺʹ´½¨ËüµÄĸÏ̱߳£³ÖÒ»Ö¡£Èç¹ûÖ÷UIÏ̴߳´½¨³öÁ˼¸Ê®¸ö¹¤×÷Ị̈߳¬ÕâЩ¹¤×÷Ï̵߳ÄÓÅÏȼ¶¾ÍĬÈϺÍÖ÷Ï̱߳£³ÖÒ»ÖÂÁË£¬ÎªÁ˲»ÈÃд´½¨µÄ¹¤×÷Ï̺߳ÍÖ÷Ïß³ÌÇÀÕ¼CPU×ÊÔ´£¬ÐèÒª°ÑÕâЩÏ̵߳ÄÓÅÏȼ¶½øÐнµµÍ´¦Àí£¬ÕâÑù²ÅÄܸø°ï×éCPUʶ±ðÖ÷´Î£¬Ìá¸ßÖ÷Ïß³ÌËùÄܵõ½µÄϵͳ×ÊÔ´¡£

ÔÚAndroidϵͳÀïÃæ£¬ÎÒÃÇ¿ÉÒÔͨ¹ýandroid.os.Process.setThreadPriority(int)ÉèÖÃÏ̵߳ÄÓÅÏȼ¶£¬²ÎÊý·¶Î§´Ó-20µ½24£¬ÊýֵԽСÓÅÏȼ¶Ô½¸ß¡£Androidϵͳ»¹ÎªÎÒÃÇÌṩÁËÒÔϵÄһЩԤÉèÖµ£¬ÎÒÃÇ¿ÉÒÔͨ¹ý¸ø²»Í¬µÄ¹¤×÷Ïß³ÌÉèÖò»Í¬ÊýÖµµÄÓÅÏȼ¶À´´ïµ½¸üϸÁ£¶ÈµÄ¿ØÖÆ¡£

´ó¶àÊýÇé¿öÏ£¬Ð´´½¨µÄÏß³ÌÓÅÏȼ¶»á±»ÉèÖÃΪĬÈϵÄ0£¬Ö÷Ïß³ÌÉèÖÃΪ0µÄʱºò£¬Ð´´½¨µÄÏ̻߳¹¿ÉÒÔÀûÓÃTHREAD_PRIORITY_LESS_FAVORABLE»òÕßTHREAD_PRIORITY_MORE_FAVORABLEÀ´¿ØÖÆÏ̵߳ÄÓÅÏȼ¶¡£

AndroidϵͳÀïÃæµÄAsyncTaskÓëIntentServiceÒѾĬÈϰïÖúÎÒÃÇÉèÖÃÏ̵߳ÄÓÅÏȼ¶£¬µ«ÊǶÔÓÚÄÇЩ·Ç¹Ù·½ÌṩµÄ¶àÏ̹߳¤¾ßÀ࣬ÎÒÃÇÐèÒªÌØ±ðÁôÒâ¸ù¾ÝÐèÒª×Ô¼ºÊÖ¶¯À´ÉèÖÃÏ̵߳ÄÓÅÏȼ¶¡£


10£© Profile GPU Rendering : M Update
´ÓAndroid Mϵͳ¿ªÊ¼£¬ÏµÍ³¸üÐÂÁËGPU ProfilingµÄ¹¤¾ßÀ´°ïÖúÎÒÃǶ¨Î»UIµÄäÖȾÐÔÄÜÎÊÌâ¡£ÔçÆÚµÄCPU Profiling¹¤¾ßÖ»ÄÜ´ÖÂÔµÄÏÔʾ³öProcess¡¢Execute¡¢UpdateÈý´ó²½ÖèµÄʱ¼äºÄ·ÑÇé¿ö¡£

µ«Êǽö½öÏÔʾÈý´ó²½ÖèµÄʱ¼äºÄ·ÑÇé¿ö£¬»¹ÊDz»Ì«Äܹ»ÇåÎú°ïÖúÎÒÃǶ¨Î»¾ßÌåµÄ³ÌÐò´úÂëÎÊÌ⣬ËùÒÔÔÚAndroid M°æ±¾¿ªÊ¼£¬GPU Profiling¹¤¾ß°ÑäÖȾ²Ù×÷²ð½â³ÉÈçÏÂ8¸öÏêϸµÄ²½Öè½øÐÐÏÔʾ¡£

¾É°æ±¾ÖÐÌáµ½µÄProcess¡¢Execute¡¢Update»¹ÊǼÌÐøµÃµ½Á˱£Áô£¬ËûÃǵĶÔÓ¦¹ØÏµÈçÏ£º

½ÓÏÂÈ¥ÎÒÃÇ¿´ÏÂÆäËû5¸ö²½Öè·Ö±ð´ú±íÁËʲôº¬Ò壺
Sync & Upload£ºÍ¨³£±íʾµÄÊÇ×¼±¸µ±Ç°½çÃæÉÏÓдý»æÖƵÄͼƬËùºÄ·ÑµÄʱ¼ä£¬ÎªÁ˼õÉٸöÎÇøÓòµÄÖ´ÐÐʱ¼ä£¬ÎÒÃÇ¿ÉÒÔ¼õÉÙÆÁÄ»ÉϵÄͼƬÊýÁ¿»òÕßÊÇËõСͼƬ±¾ÉíµÄ´óС¡£
Measure & Layout£ºÕâÀï±íʾµÄÊDz¼¾ÖµÄonMeasureÓëonLayoutËù»¨·ÑµÄʱ¼ä£¬Ò»µ©Ê±¼ä¹ý³¤£¬¾ÍÐèÒª×Ðϸ¼ì²é×Ô¼ºµÄ²¼¾ÖÊDz»ÊÇ´æÔÚÑÏÖØµÄÐÔÄÜÎÊÌâ¡£
Animation£º±íʾµÄÊǼÆËãÖ´Ðж¯»ËùÐèÒª»¨·ÑµÄʱ¼ä£¬°üº¬µÄ¶¯»ÓÐObjectAnimator£¬ViewPropertyAnimator£¬TransitionµÈµÈ¡£Ò»µ©ÕâÀïµÄÖ´ÐÐʱ¼ä¹ý³¤£¬¾ÍÐèÒª¼ì²éÊDz»ÊÇʹÓÃÁ˷ǹٷ½µÄ¶¯»¹¤¾ß»òÕßÊǼì²é¶¯»Ö´ÐеĹý³ÌÖÐÊDz»ÊÇ´¥·¢Á˶Áд²Ù×÷µÈµÈ¡£
Input Handling£º±íʾµÄÊÇϵͳ´¦ÀíÊäÈëʼþËùºÄ·ÑµÄʱ¼ä£¬´ÖÂÔµÈÓÚ¶ÔÓÚµÄʼþ´¦Àí·½·¨ËùÖ´ÐеÄʱ¼ä¡£Ò»µ©Ö´ÐÐʱ¼ä¹ý³¤£¬Òâζ×ÅÔÚ´¦ÀíÓû§µÄÊäÈëʼþµÄµØ·½Ö´ÐÐÁ˸´ÔӵIJÙ×÷¡£
Misc/Vsync Delay£ºÈç¹ûÉÔ¼Ó×¢Ò⣬ÎÒÃÇ¿ÉÒÔÔÚ¿ª·¢Ó¦ÓõÄLogÈÕÖ¾ÀïÃæ¿´µ½ÕâÑùÒ»ÐÐÌáʾ£ºI/Choreographer(691): Skipped XXX frames! The application may be doing too much work on its main thread¡£ÕâÒâζ×ÅÎÒÃÇÔÚÖ÷Ïß³ÌÖ´ÐÐÁËÌ«¶àµÄÈÎÎñ£¬µ¼ÖÂUIäÖȾ¸ú²»ÉÏvSyncµÄÐźŶø³öÏÖµôÖ¡µÄÇé¿ö¡£
ÉÏÃæ8ÖÖ²»Í¬µÄÑÕÉ«Çø·ÖÁ˲»Í¬µÄ²Ù×÷ËùºÄ·ÑµÄʱ¼ä£¬ÎªÁ˱ãÓÚÎÒÃÇѸËÙÕÒ³öÄÇЩÓÐÎÊÌâµÄ²½Ö裬GPU Profiling¹¤¾ß»áÏÔʾ16msµÄãÐÖµÏߣ¬ÕâÑù¾ÍºÜÈÝÒ×ÕÒ³öÄÇЩ²»ºÏÀíµÄÐÔÄÜÎÊÌâ¡£ÔÙ×Ðϸ¿´¶ÔÓ¦¾ßÌåÄĸö²½ÖèÏà¶ÔÀ´ËµºÄ·Ñʱ¼ä±ÈÀý¸ü´ó£¬½áºÏÉÏÃæ½éÉܵÄϸ»¯²½Ö裬´Ó¶ø¿ìËÙ¶¨Î»ÎÊÌ⣬ÐÞ¸´ÎÊÌâ¡£ |