【Android 开发】: Android 消息处理机制之二: Message 中 obtain()源代码剖析

本文详细解析了Android中Message对象的obtain()方法,探讨为何不能直接使用`new Message()`,而是要通过obtain()获取。通过分析源码,介绍了Message的多个重载obtain()方法,包括它们的底层实现和如何封装Handler和数据。此外,还讨论了如何使用Bundle传递复杂数据类型。
摘要由CSDN通过智能技术生成

  阅读本文之前,请先阅读相关链接:

  Android 消息处理机制之一: Handler与Message

  Android 消息处理机制之三: Handler中sendMessage()源代码剖析

  在上一讲中[Android消息处理机制之Handler与Message],我们学习了Handler类与Message类的大概介绍,同事也遗留了一个问题,在获取Message对象的时候是不能用 "new Message" 的方式来获取,而必须使用 Obtain()的方式来获取Message对象,这是为什么呢?

  我们可以针对上一讲的例子中的代码如下:

                httpResponse = httpClient.execute(httpGet);
                if(200 == httpResponse.getStatusLine().getStatusCode()){
                    byte[] data = EntityUtils.toByteArray(httpResponse.getEntity());
                    // 这里的数据data我们必须发送给UI的主线程,所以我们通过Message的方式来做桥梁。
                    Message message = Message.obtain();
                    message.obj = data;
                    message.what = DOWNLOAD_IMG;
                    handler.sendMessage(message);
                }

1) 跟踪Message.java中的obtain()方法如下:

    private static final Object sPoolSync = new Object();
    private static Message sPool;
    private static int sPoolSize = 0;

    private static final int MAX_POOL_SIZE = 10;
    
    /**
     * 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;
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }

【分析】: 从obtain()的源代码中我们可以知道,它是静态方法,而且只有在spool = null 的情况下才会new出一个Message(),返回一个Message对象,如果在不为空的情况下,Message的对象都是从Message对象池里面拿的实例从而重复使用的,这也为了Android中的Message对象能够更好的回收。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值