我是第一次实现协程。我正在为一个简单的登录应用程序遵循 MVP 模式。这是我的代码流 -
单击的登录按钮将遵循此方向 -
LoginFragment -> LoginPresenter -> Repository -> APIRepository -> RetrofitInterface
登录响应将遵循这个方向 -
RetrofitInterface -> APIRepository -> Repository -> LoginPresenter -> LoginFragment
这是代码 -
RetrofitInterface.kt
@POST("login")
fun loginAPI(@Body loginRequest: LoginRequest): Deferred<LoginResponse>?
Run Code Online (Sandbox Code Playgroud)
这是我的 Result.kt
sealed class Result<out T : Any> {
class Success<out T : Any>(val data: T) : Result<T>()
class Error(val exception: Throwable, val message: String = exception.localizedMessage) : Result<Nothing>()
}
Run Code Online (Sandbox Code Playgroud)
APIRepository.kt
override suspend fun loginAPICall(loginRequest: LoginRequest) : Result<LoginResponse>? {
try {
val loginResponse = apiInterface?.loginAPI(loginRequest)?.await() …
Run Code Online (Sandbox Code Playgroud) 首次使用协程。需要帮忙。
这是我的流程:
演示者要登录,因此调用存储库接口。仓库实现RepositoryInterface。因此,存储库调用APIInterface。APIInterface由APIInterfaceImpl实现。APIInterfaceImpl最终调用MyRetrofitInterface。
这是图解的流程图:
演示者->存储库-> APIInterfaceImpl-> MyRetrofitInterface
获得登录响应后:
APIInterfaceImpl->存储库->将数据存储在缓存中->将HTTP状态代码提供给Presenter
这是我的代码:
RepositoryInterface.kt
fun onUserLogin(loginRequest: LoginRequest): LoginResponse
Run Code Online (Sandbox Code Playgroud)
仓库
class Repository : RepositoryInterface {
private var apiInterface: APIInterface? = null
override fun onUserLogin(loginRequest: LoginRequest): LoginResponse {
return apiInterface?.makeLoginCall(loginRequest)
}
}
Run Code Online (Sandbox Code Playgroud)
APIInterface.kt
suspend fun makeLoginCall(loginRequest): LoginResponse?
Run Code Online (Sandbox Code Playgroud)
APIInterfaceImpl.kt
override suspend fun makeLoginCall(loginRequest: LoginRequest): LoginResponse? {
if (isInternetPresent(context)) {
try {
val response = MyRetrofitInterface?.loginRequest(loginRequest)?.await()
return response
} catch (e: Exception) {
//How do i return a status code here
}
} else {
//How do …
Run Code Online (Sandbox Code Playgroud)