Я использую сопрограммы kotlin и у меня 2 проблемы -
1) Мой вызов API происходит на Main thread
, который я на самом деле хочу на IO
, а обратный вызов пользовательского интерфейса происходит на Main thread
, что нормально.
2) job.cancel()
не похоже на работу. Когда выполняется вызов API и я хочу остановить его, я вызываю stopAPICall()
, но, похоже, он не действует
class MyDetails(val callback: Callback,
private val coroutineCtx: CoroutineContext = Dispatchers.Main) : KoinComponent, CoroutineScope {
private val job = Job()
private val repo: IRepo by inject { parametersOf(this) }
override val coroutineContext: CoroutineContext
get() = job + coroutineCtx
fun verifyMyDetails(id: String?) = launch {
Log.e("TAG","Coroutines started =" + Thread.currentThread().name) //Prints Main
val response = repo.processId(id)
when (response) {
is APIResult.Success -> {
Log.e("TAG","Updating UI =" + Thread.currentThread().name) //Prints Main
callback.onSuccess(response.data.myDetails)
}
is APIResult.Error -> {
callback.onAPIError(response.code)
}
}
}
fun stopAPICall() {
job.cancel()
}
}
class Repo(): IRepo {
override suspend fun processId(id: String) {
val response = apiInterface.processIdCall(id).await()
try {
return ...
} catch(e: HttpException) {
return ...
}
}
}