热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

协程执行任务

嗨,这是我的用户存储库classUserRepository(privatevalappAuth:FirebaseAuth):SafeAuthReques

嗨,这是我的用户存储库

class UserRepository(private val appAuth: FirebaseAuth) : SafeAuthRequest(){
suspend fun userLogin(email: String,password: String) : AuthResult{
return authRequest { appAuth.signInWithEmailAndPassword(email,password)}
}
}

这是SafeAuthRequest类

open class SafeAuthRequest {
suspend fun authRequest(call : suspend () -> Task) : T{
val task = call.invoke()
if(task.isSuccessful){
return task.result!!
}
else{
val error = task.exception?.message
throw AuthExceptions("$error\nInvalid email or password")
}
}
}

在上述情况下打电话

/** Method to perform login operation with custom */
fun onClickCustomLogin(view: View){
authListener?.onStarted()
Coroutines.main {
try {
val authResult = repository.userLogin(email!!,password!!)
authListener?.onSuccess()
}catch (e : AuthExceptions){
authListener?.onFailure(e.message!!)
}
}
}

和我的authListener这样

interface AuthListener {
fun onStarted()
fun onSuccess()
fun onFailure(message: String)
}

由于任务未完成,我遇到了错误

是执行任务的正确方法


我正在使用MVVM体系结构模式,因此要提供的示例是从我的ViewModel类中调用的,这意味着我可以访问viewModelScope。如果要在Activity类上运行类似的代码,则必须使用可用于Activity的Coroutines范围,例如:

val uiScope = CoroutineScope(Dispatchers.Main)
uiScope.launch {...}

回答您的问题,我从用户存储库中检索登录名的操作是这样的:

//UserRepository.kt
class UserRepository(private val appAuth: FirebaseAuth) {
suspend fun userLogin(email: String,password: String) : LoginResult{
val firebaseUser = appAuth.signInWithEmailAndPassword(email,password).await() // Do not forget .await()
return LoginResult(firebaseUser)
}
}

LoginResult是Firebase身份验证响应的包装类。

//ClassViewModel.kt
class LoginFirebaseViewModel(): ViewModel(){
private val _loginResult = MutableLiveData()
val loginResult: LiveData = _loginResult
fun login() {
viewModelScope.launch {
try {
repository.userLogin(email!!,password!!).let {
_loginResult.value = it
}
} catch (e: FirebaseAuthException) {
// Do something on firebase exception
}
}
}
}

Activity类的代码如下:

// Function inside Activity
fun onClickCustomLogin(view: View){
val uiScope = CoroutineScope(Dispatchers.Main)
uiScope.launch {
try {
repository.userLogin(email!!,password!!).let {
authResult = it
}
}catch (e : FirebaseAuthException){
// Do something on firebase exception
}
}
}

使用协程的主要好处之一是您可以按顺序转换异步代码。这意味着您不需要侦听器或回调。

希望对您有帮助


推荐阅读
author-avatar
手机用户2602883205_410
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有