Android studio (Kotlin) 在类中获取设备的 X 和 Y 坐标
Posted
技术标签:
【中文标题】Android studio (Kotlin) 在类中获取设备的 X 和 Y 坐标【英文标题】:Android studio (Kotlin) Get X and Y coordinates of device in class 【发布时间】:2020-08-21 10:29:14 【问题描述】:我自己用两个 Double val(经度和纬度)创建了一个 Location 类
现在在一个空的构造函数中,我想使用 FusedLocationProviderClient 来获取设备的当前位置,然后将其存储在两个 val 中以表示当前位置。我使用 LocationServices 制作了一个,然后在 onSucces 中将变量放入类中。问题是我收到以下错误:
由于可能的重新分配,禁止对捕获的成员值进行初始化
构造函数如下:
constructor(context: Context)
val client = LocationServices.getFusedLocationProviderClient(context)
client.lastLocation.addOnSuccessListener location: Location? ->
if (location != null)
this.latitude = location.latitude
this.longitude = location.longitude
else
this.latitude = 0.0
this.longitude = 0.0
我有点迷路了。如何解决此问题,以便在变量中包含用户坐标?
是否有某种方式,例如,我强制 lastlocation 先完成,然后再存储变量,以便编译器确定它有一个不会被重新分配的值?
【问题讨论】:
【参考方案1】:我假设你的类的latitude
和longitude
属性是只读的val
s。如果您没有在构造函数中分配它们,则无法将它们设为 val
。在您的代码中,您在回调中分配它们(稍后将调用的代码),因此在构造函数返回时它们不会被初始化,并且您试图在它们为只读时设置它们的值。
您需要将它们变成var
读写属性。您可以给它们默认值0.0
,这样它们就不必为空。
【讨论】:
或者lateinit vars?? 我个人不会将lateinit
用于在回调中初始化的东西(不可预测的时间)。然后,如果不使用反射检查它是否已初始化,您将无法安全地使用它。无论如何,lateinit
不能用于原语。
有什么办法可以等到等待位置完成,然后构造函数通过?我尝试将其更改为 var,将其初始化为 0.0 但是在打印我制作的对象的经度和纬度时,这将打印 0.0。可能是因为回调没有完成。我能轻松避免这种情况吗?
最好创建一个协程并使用构造函数启动它,然后将suspendCoroutine 放在那里,并将作业的实例存储在类的属性中,并在需要使用变量时调用 join()。
您不应在构造函数中放置阻塞(耗时)代码,否则会导致您的应用程序挂起并面临应用程序无响应 (ANR) 错误的风险。 (但技术上可以使用 FutureTask 来做到这一点,如果你不介意有一个因 ANR 崩溃的 janky 应用程序。)你可以考虑在这个类中添加一个 ready
属性,并将其设置为 @位置侦听器回调中的 987654331@。然后在协程中实例化这个类,并使用像while (!myLocationClass.ready) delay(50)
这样的循环来等待结果。以上是关于Android studio (Kotlin) 在类中获取设备的 X 和 Y 坐标的主要内容,如果未能解决你的问题,请参考以下文章
Android@Kotlin 在Android studio 中配置Kotlin