我們平時(shí)在做到多線程問題的時(shí)候可能利用Handler去傳遞Message,其中,經(jīng)常使用的就是
1、new Handler().obtainMessage().sendToTarget();
2、new Handler().sendMessage(new Message());
第一種是直接傳遞what,obj等,msg的一些數(shù)據(jù),第二種是初始化一個(gè)msg,然后賦值msg的一些數(shù)據(jù),以Message的對(duì)象去send,在使用上這兩種都可以實(shí)現(xiàn)需求,那么這兩種有什么區(qū)別呢?廢話不多說,直接源碼走起:
先看第一種:

注意看注釋,返回了一個(gè)來自消息池的Message對(duì)象,也就是說Message.obtain返回的是一個(gè)消息池的msg對(duì)象,那么做了什么呢,繼續(xù)跟

看看注釋,就是說等同于obtain()方法,返回了一個(gè)帶target標(biāo)志的Message,就是給Message打上Handler的標(biāo)志,好區(qū)分的意思,沒別的意思,主要就是obtain()方法,如下

就如同最開始說的那樣從MessagePool 返回一個(gè)新的Message實(shí)例,避免分配新對(duì)象,省去了創(chuàng)建對(duì)象申請(qǐng)內(nèi)存的開銷。。。。。

得到了Message后,調(diào)用了sendToTarget(),,里面調(diào)用了sendMessage(),這就是和方法二一樣的了, new Handler().sendMessage(new Message());
總結(jié)下就是說利用obtainMessage().sendToTarget()是從MessagePool 返回一個(gè)新的Message實(shí)例可以避免我們?nèi)?chuàng)建Message對(duì)象申請(qǐng)內(nèi)存開銷。ok,分析完畢,如果有說的不對(duì)或者不合適的歡迎指出。