Вы неправильно настроили coroutineContext
. Вместо этого вы должны иметь
override val coroutineContext = Dispatchers.MAIN + job
Если вам когда-нибудь понадобится диспетчер IO
, тогда потребуйте его явно:
withContext(Dispatchers.IO) { ... blocking IO code ... }
Чтобы приостановить сопрограмму, позвоните suspendCancellableCoroutine
, иначе вы не получите никакой выгоды от структурированного параллелизма.
Еще одна деталь: не пишите код после it.resume
в блоке suspendCancellableCoroutine
. Если диспетчер решит возобновить сопрограмму немедленно, в рамках вызова resume
, этот код не будет выполнен, пока не будет выполнен весь код сопрограммы (или, по крайней мере, до следующей точки приостановки).
override fun onLocationResult(result: LocationResult) {
fusedLocationProviderClient.removeLocationUpdates(this)
it.resume(result.lastLocation.run { latitude at longitude })
}