Android中獲得Message物件三種方式的去唄
阿新 • • 發佈:2019-02-19
獲得Message物件的三種方式
1.new Message()
2.Message.obtain()
3.handler.obtainMessage()
1.new Message();
這個方法沒什麼好多說的就是new一個物件
2.Message.obtain();
點進去看原始碼:
/**
* Return a new Message instance from the global pool. Allows us to
* avoid allocating new objects in many cases.
*/
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize--;
return m;
}
}
return new Message();
}
看註釋可知道,從訊息池中返回一個新的例項,避免我們建立更多的例項物件,那麼這個訊息池是什麼呢?我們找一下:
private static Message sPool;
private static final int MAX_POOL_SIZE = 50;
訊息池最多能夠儲存50個訊息,這裡類似於執行緒池,同時根據原始碼我們也可以知道obtain()方法是執行緒安全的。所以通過這種方法建立Message物件可以避免建立新的Message物件,達到節省記憶體的作用。(ps:handler處理完訊息,訊息佇列會自動recycle()釋放訊息,有時候我們在使用的時候會報該訊息還在使用,這是因為這個訊息還未處理,我們又傳送了這個訊息,這時我們只需要重新建立一個訊息。)
3.handler.obtainMessage();
/**
* Returns a new {@link android.os.Message Message} from the global message pool. More efficient than
* creating and allocating new instances. The retrieved message has its handler set to this instance (Message.target == this).
* If you don't want that facility, just call Message.obtain() instead.
*/
public final Message obtainMessage()
{
return Message.obtain(this);
}
/**
* Same as {@link #obtain()}, but sets the values for both <em>target</em> and
* <em>what</em> members on the Message.
* @param h Value to assign to the <em>target</em> member.
* @param what Value to assign to the <em>what</em> member.
* @return A Message object from the global pool.
*/
public static Message obtain(Handler h, int what) {
Message m = obtain();//呼叫了obtain方法
m.target = h;
m.what = what;
return m;
}
從註釋可以知道,這個函式會將handler物件賦值給message.taget,如果不想要這種便利,可以呼叫Message.obtain()函式,個人比較傾向於使用handler.obtainMessage();
總結:
1.new Message()沒有任何技術含量
2.Message.obtain(),從訊息池中複用Message物件,節省記憶體,而且現成安全
3.handler.obtainMessage()會將handler賦值給message.target,提供便利
在使用的過程中,使用Message.obtain(),或者handler.obtainmessage()