1. 程式人生 > >Android中獲得Message物件三種方式的去唄

Android中獲得Message物件三種方式的去唄

獲得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()