阅读本文之前,请先阅读相关链接:
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对象能够更好的回收。