如何在Android中用好多线程

 Ê×ÏÈÎÒÃÇ˼¿¼¼¸¸öÎÊÌ⣬ÔÚAndroidÓ¦ÓÃÖÐΪʲôҪÓöàÏß³Ì?ΪÁ˽â¾öÄÄЩÎÊÌ⣿»òÕßΪÁËʵÏÖÄÄЩ¹¦ÄÜ£¿ÓÐÄÄЩºÃ´¦£¿ÇëÏÈ˼¿¼Ò»·ÖÖÓ£¬ÔÙ¼ÌÐøÍùÏ¿´¡£

ѧϰ¶ø²»Ë¼¿¼¾ÍÏñ³Ô¶«Î÷¶ø²»½À£¬ÒªÃ´ÎÞ·¨ÏÂÑÊ£¬ÒªÃ´³¢²»³öζµÀ£¬Í¬Ê±¶¼»áÓ°ÏìÏû»¯ÎüÊÕ¡£¿ØÖÆÒ»ÏÂÄãÄÇÍÑçÖÒ°ÂíÒ»ÑùµÄºÃÆæÐÄ°É£¬ÏÈ˼¿¼ÔÙÍùÏ¿´¡£

¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ªÆ®¹ýÕâÌõ·Ö¸ôÏߣ¬ÎÒÃǼÌÐø¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª

1. ΪʲôҪÓöàÏß³Ì

ÕâÀïÁгö¼¸¸öÔ­Òò£º

a) Ìá¸ßÓû§ÌåÑé»òÕß±ÜÃâANR

ÔÚʼþ´¦Àí´úÂëÖÐÐèҪʹÓöàỊ̈߳¬·ñÔò»á³öÏÖANR(Application is not responding)£¬»òÕßÒòΪÏìÓ¦½ÏÂýµ¼ÖÂÓû§ÌåÑéºÜ²î¡£

5

ͼ1 ANR¶Ô»°¿ò

²âÊÔANRµÄ·½·¨¼ûʾÀý¹¤³Ì¡¶EX10_01ANR¡·

b) Òì²½

Ó¦ÓÃÖÐÓÐЩÇé¿öϲ¢²»Ò»¶¨ÐèҪͬ²½×èÈûÈ¥µÈ´ý·µ»Ø½á¹û£¬¿ÉÒÔͨ¹ý¶àÏß³ÌÀ´ÊµÏÖÒì²½£¬ÀýÈ磺ÉÏÒ»µãÖÐÌáµ½µÄ£¬ÄãµÄÓ¦ÓÃÖеÄij¸öActivityÐèÒª´ÓÔƶ˻ñȡһЩͼƬ£¬¼ÓÔØͼƬ±È½ÏºÄʱ£¬ÕâʱÐèҪʹÓÃÒì²½¼ÓÔØ£¬¼ÓÔØÍê³ÉÒ»¸öͼƬˢÐÂÒ»¸ö£¬¼ûÏÂÃæͼ2¡¢Í¼3 ¡£

c) ¶àÈÎÎñ

ÀýÈç¶àÏß³ÌÏÂÔØ¡£

ºóÁ½µãÓëJavaÖеĶàÏß³ÌÓ¦ÓÃûÓÐÌ«´óÇø±ð£¬²»Ï¸Ëµ¡£

ÏÂÃæÖصã˵Ã÷µÚÒ»µã£¬¼´ÈçºÎ¼õÉÙʼþÏìÓ¦µÄʱ¼ä´Ó¶øÌá¸ßÓû§ÌåÑ飬ÒÔ¼°ÈçºÎ±ÜÃâANR¡£

2. Ϊʲôͨ¹ý¶àÏ߳̿ÉÒÔÌá¸ßÓû§ÌåÑé¡¢±ÜÃâANR

´ó¼Ò»¹¼ÇµÃÎÒÔÚȺÀï˵¹ýµÄÒƶ¯¿ª·¢µÄ¡°Èý²»Òª¡±Ô­ÔòÂ𣿼´£º²»ÒªÈÃÎÒÏë¡¢²»ÒªÈÃÎҵȡ¢²»ÒªÈÃÎÒ·³¡£ÏìÓ¦ÂýÁËÓû§ÐèÒªµÈ£¬µÈµÄ´ÎÊý¶àÁ˾ͻᷳ£¬ÄãµÄÓ¦ÓÃÀ뱻жÔز»Ô¶ÁË¡£

Ê×ÏÈÎÒÃÇÀ´Á˽âÒ»ÏÂAndroidÓ¦ÓóÌÐòµÄmainỊ̈߳¬Ëü¸ºÔð´¦ÀíUIµÄ»æÖÆ£¬AndroidϵͳΪÁË·ÀÖ¹Ó¦ÓóÌÐò·´Ó¦½ÏÂýµ¼ÖÂϵͳÎÞ·¨Õý³£ÔËÐÐ×öÁËÒ»¸ö´¦Àí£¬Ò»ÖÖÇé¿öÊǵ±Óû§ÊäÈëʼþÔÚ5ÃëÄÚÎÞ·¨µÃµ½ÏìÓ¦£¬ÄÇôϵͳ»áµ¯³öANR¶Ô»°¿ò£¬ÓÉÓû§¾ö¶¨¼ÌÐøµÈ´ý»¹ÊÇÇ¿ÖƽáÊøÓ¦ÓóÌÐò(ÁíÒ»ÖÖÇé¿öÊÇBroadcastReciever ³¬¹ý10ÃëûִÐÐÍêÒ²»áµ¯³öANR¶Ô»°¿ò)¡£

¼´Ê¹ÄãµÄ³ÌÐòÖÐij¸öʼþÏìÓ¦²»³¬¹ý5ÃëÖÓ£¬ÈËÑÛ¿ÉÒÔ·Ö±æµÄʱ¼äÊÇ0.1Ã룬СÓÚ0.1Ãë»ù±¾¸Ð¾õ²»³öÀ´£¬³¬¹ý0.2ÃëÓû§¾ÍÄܸоõµ½Óеã¶ù¿¨ÁË£¬Ë׳ƴòàÃÏÖÏó£¬2ÃëÒÔÉϾͺÜÂýÁË£¬Óû§ÌåÑé»áºÜ²î¡£ÓÐͬѧ˵ÎÒ¿ÉÒÔÓýø¶ÈÌõ°¡£¬µ«ÄãµÄ³ÌÐòÖв»Äܵ½´¦¶¼Êǽø¶ÈÌõ£¬·ñÔòÄǸöȦȦ»á°ÑÓû§×ªÔεģ¬ºÃÏñÔÚ¶ÔÓû§Ëµ£¬»­¸öȦȦ·³ËÀÄã¡­¡­

±ÈÈçijЩӦÓã¬ËüÒªÏÔʾºÜ¶àͼƬ£¬»¹ºÃËüÊÇÒì²½µÄ£¬²»¹ýÔÚͼƬ¼ÓÔØÍê³Éǰÿ¸öͼƬµÄλÖÃÉ϶¼ÓÐÒ»¸öȦȦ£¬ÈÃÈË¿´Á˺ܷ³¡£Äã¿ÉÒÔ±äͨһÏ£¬Í¼Æ¬¼ÓÔسɹ¦Ö®Ç°ÏÔʾһ¸öĬÈϵÄͼƬ£¬¼ÓÔسɹ¦ºóÔÙË¢ÐÂһϼ´¿É£¬ºÎ±ØŪÄÇô¶à½ø¶ÈÌõÄØ£¿

1

ͼ2 ¼ÓÔØͼƬÍê³ÉÇ°ÏÔʾĬÈÏͼƬ£¬¼ÓÔØÍê³ÉºóÔÙË¢ÐÂ

2

ͼ3 ¼ÓÔØͼƬÍê³ÉÇ°ÏÔʾĬÈÏͼƬ£¬¼ÓÔØÍê³ÉºóÔÙË¢ÐÂ

3

ͼ4 תÔÎÄ㣬·³ËÀÄã

ʼþ´¦ÀíµÄÔ­Ôò£ºËùÓпÉÄܺÄʱµÄ²Ù×÷¶¼·Åµ½ÆäËûÏß³ÌÈ¥´¦Àí¡£

AndroidÖеÄMainÏ̵߳Äʼþ´¦Àí²»ÄÜÌ«ºÄʱ£¬·ñÔòºóÐøµÄʼþÎÞ·¨ÔÚ5ÃëÄڵõ½ÏìÓ¦£¬¾Í»áµ¯³öANR¶Ô»°¿ò¡£ÄÇôÄÄЩ·½·¨»áÔÚ MainÏß³ÌÖ´ÐÐÄØ£¿

  1. ActivityµÄÉúÃüÖÜÆÚ·½·¨£¬ÀýÈ磺onCreate()¡¢onStart()¡¢onResume()µÈ

  2. ʼþ´¦Àí·½·¨£¬ÀýÈçonClick()¡¢onItemClick()µÈ

ͨ³£Android»ùÀàÖÐÒÔon¿ªÍ·µÄ·½·¨ÊÇÔÚMainÏ̱߳»»Øµ÷µÄ¡£

Ìá¸ßÓ¦ÓõÄÏìÓ¦ÐÔ£¬¿ÉÒÔ´ÓÕâÁ½·½ÃæÈëÊÖ¡£

Ò»°ãÀ´Ëµ£¬ActivityµÄonCreate()¡¢onStart()¡¢onResume()·½·¨µÄÖ´ÐÐʱ¼ä¾ö¶¨ÁËÄãµÄÓ¦ÓÃÊ×Ò³´ò¿ªµÄʱ¼ä£¬ÕâÀïÒª¾¡Á¿°Ñ²»±ØÒªµÄ²Ù×÷·Åµ½ÆäËûÏß³ÌÈ¥´¦Àí£¬Èç¹ûÈÔÈ»ºÜºÄʱ£¬¿ÉÒÔʹÓÃSplashScreen¡£Ê¹ÓÃSplashScreen×îºÃÓö¯Ì¬µÄ£¬ÕâÑùÓû§ÖªµÀÄãµÄÓ¦ÓÃûÓÐËÀµô¡£

6

ͼ5 ¶¯Ì¬SplashScreen

7

ͼ6 ¾²Ì¬SplashScreen

µ±Óû§ÓëÄãµÄÓ¦Óý»»¥Ê±£¬Ê¼þ´¦Àí·½·¨µÄÖ´ÐпìÂý¾ö¶¨ÁËÓ¦ÓõÄÏìÓ¦ÐÔÊÇ·ñÁ¼ºÃ£¬ÕâÀï·ÖÁ½ÖÖÇé¿ö£º

  1. ͬ²½£¬ÐèÒªµÈ´ý·µ»Ø½á¹û¡£ÀýÈçÓû§µã»÷ÁË×¢²á°´Å¥£¬ÐèÒªµÈ´ý·þÎñ¶Ë·µ»Ø½á¹û£¬ÄÇôÐèÒªÓÐÒ»¸ö½ø¶ÈÌõÀ´ÌáʾÓû§ÄãµÄ³ÌÐòÕýÔÚÔËÐÐûÓÐËÀµô¡£Ò»°ãÓë·þÎñ¶Ë½»»¥µÄ¶¼ÒªÓнø¶ÈÌõ£¬ÀýÈçϵͳ×Ô´øµÄä¯ÀÀÆ÷£¬URLÌøתʱ»áÓнø¶ÈÌõ¡£

  2. Òì²½£¬²»ÐèÒªµÈ´ý·µ»Ø½á¹û¡£ÀýÈç΢²©ÖеÄÊղع¦ÄÜ£¬µã»÷ÍêÊղذ´Å¥ºóÊÇ·ñ³É¹¦Ö´ÐÐÍê³Éºó¸æËßÎÒ¾ÍÐÐÁË£¬ÎÒ²»ÏëµÈËü£¬ÕâÀï×îºÃʵÏÖΪÒì²½µÄ¡£

ÎÞÂÛͬ²½Òì²½£¬Ê¼þ´¦Àí¶¼¿ÉÄܱȽϺÄʱ£¬ÄÇôÐèÒª·Åµ½ÆäËûÏß³ÌÖд¦Àí£¬µÈ´¦ÀíÍê³Éºó£¬ÔÙ֪ͨ½çÃæˢС£

ÕâÀïÓÐÒ»µãҪעÒ⣬²»ÊÇËùÓеĽçÃæË¢ÐÂÐÐΪ¶¼ÐèÒª·Åµ½MainÏ̴߳¦Àí£¬ÀýÈçTextViewµÄsetText()·½·¨ÐèÒªÔÚMainÏß³ÌÖУ¬·ñÔò»áÅ׳öCalledFromWrongThreadException£¬¶øProgressBarµÄsetProgress()·½·¨Ôò²»ÐèÒªÔÚMainÏß³ÌÖд¦Àí¡£

µ±È»ÄãÒ²¿ÉÒÔ°ÑËùÓÐUI×é¼þÏà¹ØÐÐΪ¶¼·Åµ½MainÏß³ÌÖд¦Àí£¬Ã»ÓÐÎÊÌâ¡£¿ÉÒÔ¼õÇáÄãµÄ˼¿¼¸ºµ££¬µ«Äã×îºÃÁ˽âËûÃÇÖ®¼äµÄ²î±ð£¬ÕÆÎÕÊÂÎïÖ®¼äϸ΢²î±ðµÄÊÇר¼Ò¡£°Ñʼþ´¦Àí´úÂë·Åµ½ÆäËûÏß³ÌÖд¦Àí£¬Èç¹û´¦ÀíµÄ½á¹ûÐèҪˢнçÃ棬ÄÇôÐèÒªÏ̼߳äͨѶµÄ·½·¨À´ÊµÏÖÔÚÆäËûÏß³ÌÖз¢ÏûÏ¢¸øMainÏ̴߳¦Àí¡£

3. ÈçºÎʵÏÖÏ̼߳äͨѶ

ÔÚAndroidÖÐÓжàÖÖ·½·¨¿ÉÒÔʵÏÖÆäËûÏß³ÌÓëMainÏß³ÌͨѶ£¬ÎÒÃÇÕâÀï½éÉܳ£¼ûµÄÁ½ÖÖ¡£

  1. ʹÓÃAsyncTask

AsyncTaskÊÇAndroid¿ò¼ÜÌṩµÄÒì²½´¦ÀíµÄ¸¨ÖúÀ࣬Ëü¿ÉÒÔʵÏÖºÄʱ²Ù×÷ÔÚÆäËûÏß³ÌÖ´ÐУ¬¶ø´¦Àí½á¹ûÔÚMainÏß³ÌÖ´ÐУ¬¶ÔÓÚ¿ª·¢Õ߶øÑÔ£¬ËüÆÁ±ÎµôÁ˶àÏ̺߳ͺóÃæÒª½²µÄHandlerµÄ¸ÅÄî¡£Äã²»Á˽âÔõô´¦ÀíÏ̼߳äͨѶҲûÓйØϵ£¬AsyncTaskÌåÌùµÄ°ïÄã×öºÃÁË¡£²»¹ý·â×°Ô½ºÃÔ½¸ß¼¶µÄAPI£¬¶Ô³õ¼¶³ÌÐòÔ±·´¶øÔ½²»Àû£¬¾ÍÊÇÄã²»Á˽âËüµÄÔ­Àí¡£µ±ÄãÐèÒªÃæ¶Ô¸ü¼Ó¸´ÔÓµÄÇé¿ö£¬¶ø¸ß¼¶APIÎÞ·¨Íê³ÉµÃºÜºÃʱ£¬Äã¾Í±­¾ßÁË¡£ËùÒÔ£¬ÎÒÃÇÒ²ÒªÕÆÎÕ¹¦ÄܸüÇ¿´ó£¬¸ü×ÔÓɵÄÓëMainÏß³ÌͨѶµÄ·½·¨£ºHandlerµÄʹÓá£

AsyncTaskµÄʹÓ÷½·¨¼ûʾÀý¹¤³Ì¡¶EX10_02AsyncTask¡·

  1. ʹÓÃHandler

ÕâÀïÐèÒªÁ˽âAndroid SDKÌṩµÄ¼¸¸öÏ̼߳äͨѶµÄÀà¡£

2.1 Handler

HandlerÔÚandroidÀ︺Ôð·¢Ëͺʹ¦ÀíÏûÏ¢£¬Í¨¹ýËü¿ÉÒÔʵÏÖÆäËûÏß³ÌÓëMainÏß³ÌÖ®¼äµÄÏûϢͨѶ¡£

2.2 Looper

Looper¸ºÔð¹ÜÀíÏ̵߳ÄÏûÏ¢¶ÓÁкÍÏûϢѭ»·

2.3 Message

MessageÊÇÏ̼߳äͨѶµÄÏûÏ¢ÔØÌå¡£Á½¸öÂëÍ·Ö®¼äÔËÊä»õÎMessage³äµ±¼¯×°ÏäµÄ¹¦ÄÜ£¬ÀïÃæ¿ÉÒÔ´æ·ÅÈκÎÄãÏëÒª´«µÝµÄÏûÏ¢¡£

2.4 MessageQueue

MessageQueueÊÇÏûÏ¢¶ÓÁУ¬ÏȽøÏȳö£¬ËüµÄ×÷ÓÃÊDZ£´æÓдýÏ̴߳¦ÀíµÄÏûÏ¢¡£

ËüÃÇËÄÕßÖ®¼äµÄ¹ØϵÊÇ£¬ÔÚÆäËûÏß³ÌÖе÷ÓÃHandler.sendMsg()·½·¨(²ÎÊýÊÇMessage¶ÔÏó)£¬½«ÐèÒªMainÏ̴߳¦ÀíµÄʼþÌí¼Óµ½MainÏ̵߳ÄMessageQueueÖУ¬MainÏß³Ìͨ¹ýMainLooper´ÓÏûÏ¢¶ÓÁÐÖÐÈ¡³öHandler·¢¹ýÀ´µÄÕâ¸öÏûϢʱ£¬»á»Øµ÷HandlerµÄhandlerMessage()·½·¨¡£

HandlerµÄʹÓ÷½·¨¼ûʾÀý¹¤³Ì¡¶EX10_03HandlerAndMsg¡·

³ýÁËÒÔÉÏÁ½ÖÖ³£Ó÷½·¨Ö®Í⣬»¹Óм¸ÖֱȽϼòµ¥µÄ·½·¨

  1. Activity.runOnUiThread(Runnable)

  2. View.post(Runnable)

View.postDelayed(Runnable, long)

  1. Handler.post

Handler.postDelayed(Runnable, long)

4. ÀûÓÃÏ̳߳ØÌá¸ßÐÔÄÜ

ÕâÀïÎÒÃǽ¨ÒéʹÓÃÏ̳߳ØÀ´¹ÜÀíÁÙʱµÄThread¶ÔÏ󣬴Ӷø´ïµ½Ìá¸ßÓ¦ÓóÌÐòÐÔÄܵÄÄ¿µÄ¡£

Ï̳߳ØÊÇ×ÊÔ´³ØÔÚÏß³ÌÓ¦ÓÃÖеÄÒ»¸öʵÀý¡£Á˽âÏ̳߳Ø֮ǰÎÒÃÇÊ×ÏÈÒªÁ˽âÒ»ÏÂ×ÊÔ´³ØµÄ¸ÅÄî¡£ÔÚJAVAÖУ¬´´½¨ºÍÏú»Ù¶ÔÏóÊDZȽÏÏûºÄ×ÊÔ´µÄ¡£ÎÒÃÇÈç¹ûÔÚÓ¦ÓÃÖÐÐèҪƵ·±´´½¨Ïú»Ùij¸öÀàÐ͵ĶÔÏóʵÀý£¬ÕâÑù»á²úÉúºÜ¶àÁÙʱ¶ÔÏ󣬵±Ê§È¥ÒýÓõÄÁÙʱ¶ÔÏó½Ï¶àʱ£¬ÐéÄâ»ú»á½øÐÐÀ¬»ø»ØÊÕ(GC)£¬CPUÔÚ½øÐÐGCʱ»áµ¼ÖÂÓ¦ÓóÌÐòµÄÔËÐеò»µ½ÏàÓ¦£¬´Ó¶øµ¼ÖÂÓ¦ÓõÄÏìÓ¦ÐÔ½µµÍ¡£

×ÊÔ´³Ø¾ÍÊÇÓÃÀ´½â¾öÕâ¸öÎÊÌ⣬µ±ÄãÐèҪʹÓöÔÏóʱ£¬´Ó×ÊÔ´³ØÀ´»ñÈ¡£¬×ÊÔ´³Ø¸ºÔðά»¤¶ÔÏóµÄÉúÃüÖÜÆÚ¡£

Á˽âÁË×ÊÔ´³Ø£¬¾ÍºÜºÃÀí½âÏ̳߳ØÁË£¬Ï̳߳ؾÍÊÇ´æ·Å¶ÔÏóÀàÐͶ¼ÊÇÏ̵߳Ä×ÊÔ´³Ø¡£

Ï̳߳صÄʹÓ÷½·¨¼ûʾÀý¹¤³Ì¡¶EX10_04ThreadPool¡·

Ï̳߳ØÓëHandler½áºÏʹÓõķ½·¨¼ûʾÀý¹¤³Ì¡¶EX10_05HandlerAndPool¡·

ʾÀý¹¤³Ì¼û¡¶EX10_06CustomHandler¡·

ÎÒÔö¼ÓÁËÈçºÎÔÚÆäËûÏß³ÌÖд´½¨HandlerµÄÀý×Ó×÷Ϊѡѧ£¬Ç°Ã涼ÕÆÎÕºÃÁ˵Äͬѧ¿ÉÒÔ¿´Ò»Ï£¬Èç¹ûÄãÐèҪʵÏÖÒ»¸ö¸úMainÏß³ÌÀàËƵÄÏûÏ¢´¦Àí»úÖÆ£¬ÐèÒªÆäËûÏ߳̿ÉÒÔ¸úÄãµÄÏß³ÌͨѶ£¬¿ÉÒÔͨ¹ýÕâÖÖ·½·¨ÊµÏÖ¡£

±¾ÆÚÅàѵ¿Îºó×÷Òµ£ºÎªÄãµÄÓ¦ÓÃÌí¼ÓÒ»¸öSplashScreen¡£

ʾÀý¹¤³ÌÔ´´úÂë¼°´ðÒÉÔÚQQȺÖС£