【发布时间】:2020-12-25 06:08:57
【问题描述】:
我正在阅读 Android CameraX 代码实验室:https://codelabs.developers.google.com/codelabs/camerax-getting-started#4
sn-p的简化代码是这样的:
class MainActivity : AppCompatActivity() {
private var imageCapture: ImageCapture? = null
//(some other codes here...)
private fun takePhoto() {
// Get a stable reference of the modifiable image capture use case
val imageCapture = imageCapture ?: return
//(some other codes here...)
}
}
在代码实验室中,它说:
首先,获取对 ImageCapture 用例的引用。
为什么我们需要在 takePhoto() 中添加新的引用 imageCapture?
我们不能只在MainActivity 中使用imageCapture 吗?
这是为了某种“最佳实践”的东西还是我错过了什么?
任何建议将不胜感激!
【问题讨论】:
-
如果另一个线程中的一些其他代码在
takePhoto中间修改imageCapture,你认为会发生什么? -
@Louis Wasserman 我认为这只是一个引用,而不是复制,所以修改后的
imageCapture会在takePhoto中使用,即使是在原始的codelab 代码中也是如此,不是吗?跨度> -
在takePhoto的中间 -- 所以如果takePhoto没有拍快照,这个变量可能会在函数的中间被改掉,这可能会导致混乱。
-
@LouisWasserman 哦,你的意思是,拍摄“参考”的快照(克隆),而不是对象本身?好吧,我明白了。所以当你说“...如果另一个线程中的一些其他代码'修改'
imageCapture...”,'修改'意味着分配一个不同的对象,而不是修改原始对象本身。我理解正确吗?因此,如果原始对象本身在不同的线程中被修改(而不是重新分配),那么无论如何都会导致混乱,除非我们深度复制对象本身。如果我理解不正确,请告诉我。感谢您的 cmets! -
是的,没错。如果您正确使用不可变对象,那么您只需要该引用副本。
标签: java android kotlin android-camerax