【问题标题】:Mutable live-data give multiple response give old response from api and after give new response可变的实时数据给出多个响应,给出来自 api 的旧响应,然后给出新的响应
【发布时间】:2022-01-06 06:53:21
【问题描述】:

**可变实时数据从 api 给出多个响应旧响应,然后给出新响应**

可变的实时数据给出多重响应

这是我的代码

存储库

suspend fun forgotPassword(email:String,sig: String,salt: String):Response<ForgotDataClass>{
    return RetrofitInstance.api.forgotPassword(email,sig,salt)
}

查看模型

class ForgotPasswordViewModel(private val repository: Repository) : ViewModel() {

var myPassword: MutableLiveData<Response<ForgotDataClass>> = MutableLiveData()
fun forgotPassword(email: String, sig: String, salt: String) {
    viewModelScope.launch {
        val response = repository.forgotPassword(email, sig, salt)
        myPassword.value = response
    }
}

}

api接口

@POST("forgot_password.php")
 suspend fun forgotPassword(
    @Query("email") email:String,
    @Query("sig") sig:String,
    @Query("salt") salt:String
):Response<ForgotDataClass>

主要活动

viewModel.forgotPassword(email,sig1,salt1)
                    viewModel.myPassword.observe(this, { response ->
                        if (response.isSuccessful){
                            when(response.body()?.status){
                                "1" -> {
                                    finish()
                                    Toast.makeText(this, "your password reset successfully", Toast.LENGTH_SHORT).show()
                                }
                                "-2" -> {
                                    Toast.makeText(this, "Email is not exit ", Toast.LENGTH_SHORT).show()
                                }
                                else -> {
                                    Toast.makeText(this, "Try again something went wrong", Toast.LENGTH_SHORT).show()
                                }
                            }
                        } else {
                            Toast.makeText(this, "Try again something went wrong", Toast.LENGTH_SHORT).show()
                        }

【问题讨论】:

  • 清除您的问题。我不明白你的意思
  • 当我点击按钮时,我得到了旧的响应,经过一些微秒后,我得到了新的响应,我不想要旧的响应
  • 我怎样才能得到新的回应
  • 你不能使用suspend,因为改造可以提供入队方法

标签: android retrofit android-livedata mutablelivedata


【解决方案1】:

你可以试试这个。您可以像这样返回您的LiveData,我认为您不需要全局变量。并在使用不同线程更新您MutableLiveData时使用postValue

class ForgotPasswordViewModel(private val repository: Repository) : ViewModel() {

    fun forgotPassword(email: String, sig: String, salt: String): LiveData {
        var myPassword = MutableLiveData<Response<ForgotDataClass>>()
        viewModelScope.launch {
            myPassword.postValue(repository.forgotPassword(email, sig, salt))
        }
        return myPassword
    }
}

在您的片段/活动中,您可以这样调用

viewModel.forgotPassword(email,sig1,salt1).observe(this) { response ->
    // do stuff with your result
}

编辑

要处理错误,您可以像这样将调用包装在 try-catch 块中,然后捕获并处理这些错误。

    fun forgotPassword(email: String, sig: String, salt: String): LiveData {
        var myPassword = MutableLiveData<Response<ForgotDataClass>>()
        viewModelScope.launch {
            try {
                myPassword.postValue(repository.forgotPassword(email, sig, salt))
            } catch(e: HttpException) {
               // handle
            }
        }
        return myPassword
    }
}

【讨论】:

  • 非常感谢
  • api错误或者api没有响应怎么处理
  • @androiuseru 我所做的是将实际调用包装在 try-catch 块中并在那里处理错误。见编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2018-07-29
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
相关资源
最近更新 更多