代码之家  ›  专栏  ›  技术社区  ›  kibar

如果最后一个操作以异常方式完成,则Kotlin协程将立即给出异常

  •  3
  • kibar  · 技术社区  · 6 年前

    当我试图通过改型登录我的服务时。当我的服务关闭时,单击按钮10秒后,我得到一个 SocketTimeoutException 例外。 到目前为止一切正常,但再次,我点击了按钮后,错误立即给出了相同的错误。发生了什么?

    interface LoginService {
    
        @FormUrlEncoded
        @POST("/login")
        fun login(@Field("id") id: String, @Field("pw") pw: String): Deferred<Response<User>>
    
    }
    
    class LoginViewModel : ViewModel() {
    
        private var job: Job = Job()
        private val scope: CoroutineScope = CoroutineScope(Dispatchers.Main + job)
        private val service by lazy { RetrofitApiFactory().create(LoginService::class.java) }
        private val excHandler = CoroutineExceptionHandler { _, throwable ->
            Timber.e(throwable);
        }
    
        fun doLogin(id: String, pw: String) {
            scope.launch(excHandler) {
                val response = service.login(id, pw).await()
                if (response.isSuccessful) {
                    response.body()
                            ?.let { user -> doOnSuccess(user) }
                            ?: doOnError(InvalidUserException())
                } else doOnError(Exception())
            }
        }
    
        private fun CoroutineScope.doOnError(e: Throwable) {
            excHandler.handleException(coroutineContext, e)
        }
    
        private fun doOnSuccess(user: User) {
            ...
        }
    
        override fun onCleared() {
            job.cancel()
        }
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Pawel    6 年前

    你需要改变你的 CoroutineScope 不能重复使用 Job . 它已经被认为是 失败 ,所以它甚至不会开始执行。

    related issue on github .