Android(安卓)new Message()和Message.obtainMessage的区别
16lz
2021-01-26
前几天需要实现一个以太网功能就看了以太网的 源码 部分,看见了源码部分在消息处理时,发现有一些不同的地方: 平时我在处理消息时: 1、首先创建Handler对象: private Handler handler = new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case 0: break; default: break; } }; }; 2、然后是消息处理: private void TestHandlerMessage(){ Message msg = new Message(); msg.what = 1; handler.sendMessage(msg); } 但是我看别人源码部分是是这样处理的: 1、首先创建Handler对象: private Handler handler = new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case 0: break; default: break; } }; }; 2、然后是消息处理: private void obtainMessageTest(){ Message msg = handler.obtainMessage(); msg.what = 1; handler.sendMessage(msg); } 通过比较我们会发现,这两种获取Message的实例的方法不一样,于是我看了源码,果然不一样: 查看obtainMessage()源码: 图1: 进入obtain方法: 图2: 再进入objtain方法: 图3: 进入Message方法: 图4: 总结: 上面的图3中obtain方法的注释中说得很明白:从整个Messge池中返回一个新的Message实例,在许多情况下使用它,因为它能避免分配新的对象 如果是这人的话,那么通过调用obtainMessage方法获取Message对象就能避免创建对象,从而减少内存的开销了。
更多相关文章
- Android自定义view绘制顺序及相关原理
- Android(安卓)JNI 编程
- android 在源码中编译工程的方法
- Building Custom Components/建立自定义组件
- Android(安卓)更新UI的两种方法——handler和runOnUiThread()
- 使用泛型方法在Java中安全地进行强制类型转换
- [Android]使用RecyclerView替代ListView(一)
- 设置android编码格式与包的引入格式于源码一致
- Android(安卓)Dialog 弹出的时候标题栏闪烁一下的处理方法