Co Routines получают местоположение из фона

Я отправляю данные о местоположении с помощью подпрограмм в 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?
}

person Pemba Tamang    schedule 03.09.2019    source источник


Ответы (1)


Класс Worker поддерживает только синхронную работу. Это означает, что когда вы возвращаете результат, код вашего worker должен завершить свое выполнение.

В вашем случае вы должны использовать ListenerWorker (или _ 3_, если вы предпочитаете использовать Kotlin).

Взгляните на прошлогодний доклад ADS о WorkManager, он немного освещает этот вопрос. Вы также можете просмотреть мой доклад Использование WorkManager, в котором рассказывается о различиях между разными сотрудниками классы.

person pfmaggi    schedule 03.09.2019
comment
эй, я просмотрел ваши слайды и много постов, ваша презентация хороша, но я плохо разбираюсь в котлине, и среди постов я нашел тот, который делает то, что я хочу ... это правильный способ сделать это ?? stackoverflow.com/questions/54083654/ - person Pemba Tamang; 03.09.2019
comment
да, вы можете следовать этому ответу. - person pfmaggi; 03.09.2019
comment
Пожалуйста, не используйте сопрограммы внутри класса Worker, используйте CoroutineWorker или ListenableWorker. - person pfmaggi; 04.09.2019
comment
здесь не так много примеров, я новичок и не мог понять большую часть кода, но я попробую. Большое спасибо за вашу помощь. - person Pemba Tamang; 04.09.2019
comment
Я пытаюсь работать с ListenerWorker, но SettableFuture.create является закрытым в соответствии с предупреждением о линтах и ​​не может использоваться. Это правильно или это ошибка, как описано здесь stackoverflow.com/a/52825547/8528047, потому что я все еще понимаю на androidx.work:work-runtime:2.2.0 - person Pemba Tamang; 04.09.2019
comment
или этот код с защелкой обратного отсчета будет работать stackoverflow.com/a/50425201/10800406 - person Pemba Tamang; 04.09.2019