Dagger2-如何每次提供一个新实例

时间:2019-12-18 15:35:17

标签: android kotlin-coroutines

我是Coroutines的新手,我到处都读过一些文档。我有一个基本问题,但无法解决。。。基本上,当用户单击“连接”按钮(简易)时,我正在呼叫服务器以检查身份验证。

身份验证存储库

@WorkerThread
suspend fun getAuthenticationToken(loginModel: LoginModel):TokenModel {
 return webService.getAuthenticationToken(loginModel)
}

WebService

suspend fun getToken(loginModel: LoginModel): TokenModel {
    val result = client.get<TokenModel>("https://app.com/rest/login") {
        url {
            parameters.append("login", loginModel.login)
            parameters.append("password", loginModel.password)
        }
    }.data
    client.close()
    return result
}

我第一次得到正确的结果。

第二次单击按钮。

Exception: kotlinx.coroutines.JobCancellationException: Parent job is Completed;

编辑

好的,问题出在client.close()调用上。我正在使用Dagger2提供客户端,但是Ktor文档说该客户端需要在调用后关闭。我该怎么做,我的意思是每次都可以提供一个客户端吗?

像这样提供客户端

@Provides
internal fun provideKtorHttpClient(): HttpClient {
    return HttpClient(Android) {
        install(JsonFeature) {
            serializer = KotlinxSerializer()
        }
    }
}

在网络服务中

@Provides
internal fun provideKWebService(client: HttpClient): KWebServices = KWebServices(client)

最后在仓库中

@Provides
internal fun provideAuthenticationRemoteDataSource(ws: KWebServices): AuthenticationRemoteDataSource = AuthenticationRemoteDataSourceImpl(ws)

如果可以的话,谢谢。

0 个答案:

没有答案