【问题标题】:Co Routines get location from backgroundCo Routines 从后台获取位置
【发布时间】:2019-09-03 06:18:36
【问题描述】:

我正在使用 workmanager 中的协同程序发送位置数据。 我尝试只使用workmanager,但它不做异步工作 我尝试了 ListenableWorkmanager,但这对我来说太复杂了,所以我尝试使用协程。

override fun doWork(): Result {

     CoroutineScope(IO).launch  {
        val location = work()
         fusedLocationClient!!.removeLocationUpdates(locationCallback)
          string = logData(location)
     }
        return if(JSONObject(string).get("status") == "1"){
            Result.success()
        }else{
            Result.retry()
        }

    }

我在如何从 work 函数返回位置时遇到问题

 private suspend fun work():Location{
...............

 fusedLocationClient!!.lastLocation.addOnSuccessListener { location ->
            if (location != null) {
                mCurrentLocation = location
          // how do I send this location back to the fuction??
            }
        }.addOnFailureListener {
            mLog.i(TAG, it.message)
        }
return mCurrentLocation // if I do this could be a null right?
}

【问题讨论】:

    标签: android location kotlin-coroutines android-workmanager


    【解决方案1】:

    Worker 类仅支持同步工作。这意味着当你返回结果时,你的worker中的代码需要已经完成了它的执行。

    在您的情况下,您应该使用 ListenerWorker(如果您更喜欢使用 Kotlin,则应使用 CoroutineWorker)。

    看看去年的ADS talk on WorkManager,它涵盖了这一点。您还可以查看我的演讲 Embracing WorkManager,其中涵盖了不同 Worker 类之间的差异。

    【讨论】:

    • 嘿,我浏览了您的幻灯片和很多帖子,您的演示文稿很好,但我不擅长 kotlin,在帖子中我发现一个正在做我想做的事.. 这是正确的方法去做吧?? stackoverflow.com/questions/54083654/…
    • 是的,你可以按照这个答案。
    • 请不要在 Worker 类中使用协程,使用 CoroutineWorker 或使用 ListenableWorker。
    • 没有太多的例子可以继续,我是新手,我不能理解很多代码,但我会试一试。非常感谢您的帮助。
    • 我正在尝试使用 ListenerWorker,但根据 lint 警告,SettableFuture.create 是私有的,无法使用。这是正确的还是这里讨论的错误stackoverflow.com/a/52825547/8528047 因为我还在androidx.work:work-runtime:2.2.0
    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 2021-01-17
    • 2013-03-14
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多