我正在尝试使用FusedLocationProviderClient和Kotlin Coroutines请求新的位置。以下是我的当前设置:
class LocationProviderImpl(context: Context) : LocationProvider, CoroutineScope {
private val TAG = this::class.java.simpleName
private val job = Job()
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.IO
private val fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context)
private val locationRequest = LocationRequest().apply {
numUpdates = 1
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
override suspend fun getLocation(): LatLng = suspendCoroutine {
val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation.run {
val latLng = latitude at longitude
it.resume(latLng)
}
fusedLocationProviderClient.removeLocationUpdates(this)
}
}
try {
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
} catch (e: SecurityException) {
throw NoLocationPermissionException()
}
}
}
但是在尝试请求新位置时,我收到了以下异常:
java.lang.IllegalStateException: Can't create handler inside thread that has not called Looper.prepare()
然而,如果我调用Looper.prepare()(以及最终的Looper.quit()),这是否意味着我只能调用该函数一次?欢迎任何帮助。
Dispatchers.Default
而不是IO进行非阻塞操作,例如计算。 - VladIO
调度程序,答案明确指出它仅适用于阻塞IO操作,并且没有人提到CPU密集型操作。 - Marko Topolnik