Android Location extras赋值异常求助:赋值后不匹配&Bundle操作失效
Android Location Extras 行为异常解析
问题1:为什么l.extras == x返回false?
当你执行这段代码:
val l = Location("SRC") val x = Bundle() l.extras = x
发现l.extras == x返回false,核心原因是Location类在接收extras时,会创建传入Bundle的副本,而非直接持有原对象的引用。
Android的Location.setExtras(Bundle)方法内部,并不是简单把传入的Bundle赋值给成员变量,而是做了一次完整复制。比如源码逻辑大致如下:
public void setExtras(Bundle extras) { if (extras == null) { mExtras = null; } else { mExtras = new Bundle(extras); // 创建新Bundle对象,复制原内容 } }
所以l.extras拿到的是一个全新的Bundle实例,和你创建的x不是同一个对象,用==(引用相等比较)自然返回false。如果要判断内容是否一致,可以用l.extras?.equals(x),这个方法会对比Bundle内的键值对内容,而非引用。
问题2:为什么Bundle().also{location.extras=it}.putBoolean("Foo", false)后extras为空?
这个问题要结合also函数的执行顺序,再加上Location的拷贝机制来理解:
- 首先
Bundle()创建了一个空Bundle实例,记为B; - 调用
also函数,把B传入lambda执行location.extras = it——此时Location会立刻复制B的空内容到内部的mExtras,这个副本记为B_copy; also执行完返回原对象B,随后调用putBoolean("Foo", false)给B添加键值对;- 但Location持有的是早已复制完成的
B_copy,它和原对象B没有关联,所以location.extras仍是空的B_copy,你修改的只是原BundleB而已。
如果想让Location的extras包含这个布尔值,需要先给Bundle填充数据,再赋值给Location:
Bundle().apply { putBoolean("Foo", false) }.also { location.extras = it }
用apply先修改Bundle内容,再赋值,此时Location复制的就是已填充好数据的Bundle了。
内容的提问来源于stack exchange,提问作者Maneki Neko
相关产品推荐
相关产品推荐

