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】:

我假设你的类的latitudelongitude 属性是只读的vals。如果您没有在构造函数中分配它们,则无法将它们设为 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

android studio 怎么使用kotlin

android studio怎么写kotlin

android studio怎么用kotlin

Android首要开发语言:架构师详解在Android Studio上使用Kotlin

在Android Studio Canary 5中将Kotlin恢复为Java代码