协程执行任务

Coroutin To Perform task

嗨,这是我的用户库

class UserRepository(private val appAuth: FirebaseAuth) : SafeAuthRequest(){

  suspend fun userLogin(email: String,password: String) : AuthResult{
     return authRequest { appAuth.signInWithEmailAndPassword(email,password)}
  }
}

这是 SafeAuthRequest class

open class SafeAuthRequest {
  suspend fun<T: Any> authRequest(call : suspend () -> Task<T>) : 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 class 调用的,这意味着我可以访问 viewModelScope。如果你想 运行 Activity class 上的类似代码,你必须使用适用于你的 Activity 的协程范围,例如:

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 身份验证响应的包装器 class。

//ClassViewModel.kt
class LoginFirebaseViewModel(): ViewModel(){
    private val _loginResult = MutableLiveData<LoginResult>()
    val loginResult: LiveData<LoginResult> = _loginResult

    fun login() {
        viewModelScope.launch {
            try {
                repository.userLogin(email!!,password!!).let {
                    _loginResult.value = it
                }
            } catch (e: FirebaseAuthException) {
                // Do something on firebase exception
            }       
        }
    }
}

Activity class 上的代码是这样的:

// 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
        }
    }
}

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

希望对你有所帮助