Сопрограммы котлин не работает, как ожидалось - PullRequest
1 голос
/ 06 апреля 2019

Я использую сопрограммы 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 ...
       }
    }
}
...