可变的实时数据给出多个响应,给出来自 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 请求没有给出响应

当我使用谷歌你管 API 获取搜索结果时,它给出 403 错误

GeoKit API 响应不可靠,每次针对相同的有效负载给出不同的响应

Agora 云录制停止 api 总是给出 404 响应

使用 Saga 获取 API 没有给出任何响应