可变的实时数据给出多个响应,给出来自 api 的旧响应,然后给出新的响应
Posted
技术标签:
【中文标题】可变的实时数据给出多个响应,给出来自 api 的旧响应,然后给出新的响应【英文标题】:Mutable live-data give multiple response give old response from api and after give new response 【发布时间】: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,因为改造可以提供入队方法 【参考方案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
块中并在那里处理错误。见编辑。以上是关于可变的实时数据给出多个响应,给出来自 api 的旧响应,然后给出新的响应的主要内容,如果未能解决你的问题,请参考以下文章
axios 在 20 秒内给出响应,但具有相同请求负载的相同 api 在 6 秒内从邮递员给出响应
当我使用谷歌你管 API 获取搜索结果时,它给出 403 错误