如何让一个函数等到它中的一个修改方法得到它的响应后再返回?
我见过很多关于堆栈溢出的问题和答案,但由于愚蠢或我没有完全得到它们。
我有一个视图模型,它给视图一个文本显示在屏幕上。
就像,我确实喜欢这个视图,activity_foo.xml:
android:text = "@{fooViewModel.getUserName()}"
并且在视图模型类中:
fun getUserName() : String = fooRepository.getUserName()
我想您会得到策略,因为它在MVVM模式中很常见。
所以FooRepository,我的意思是视图模型的真实存储库如下所示:
class MainRepository(private val userApi: UserApi) {
fun getUserList() : ArrayList<User>? {
var userList : ArrayList<User>? = null
userApi.getAllUser().enqueue(object : Callback<ArrayList<User>> {
override fun onResponse(call: Call<ArrayList<User>>, response: Response<ArrayList<User>>) {
if (response.body() != null) {
Log.e("user list succeed", response.body()!!.toString())
userList = response.body()!!
Log.e("user list saved", userList!![0].id)
}
}
override fun onFailure(call: Call<ArrayList<User>>, t: Throwable) {
Log.e("user list fail", t.message!!)
}
})
Log.e("this log", "shouldn't be above the logs in onResponse ")
return userList
}
}
这是一个通常的,典型的方法,以获取信息的服务器使用改型,我想,对吗?
视图调用其视图模型中的方法以获取要显示的内容
而视图模型调用其存储库中的方法来获取数据,即该代码中的userlist
。
我得到了我需要的数据。code>response.code().ToString()工作良好
response.body()!!.toString()
工作正常,一切正常。身体里有我想要的东西。
第二个日志也很好。
但问题是,
该函数在正文的末尾返回null。
我知道这是因为enqueue
是异步运行的,
因此,在onresponse
方法响应并将数据保存到userlist
之前,该方法返回null。
证明是在返回之前执行的第三个日志是onresponse
中的所有日志。
那么如何让这个方法在返回之前等待onresponse
完成它的工作呢?
或者,我如何使View获得一个字符串onresponse
,即使在方法返回之后?
我试过execute()
,但它不起作用,因为它不能也不应该在主线程上运行,而且android拒绝它。
谢谢你所有的评论和回答。
因此您的视图模型将包含这个而不是您的函数
fun getUserName() : LiveData<ResponseBody> = fooRepository.getUserName()
你的存储库也会是这样的
class MainRepository() {
fun getUserList() : LiveData<ResponseBody> {
MutableLiveData<ResponseBody> data = new MutableLiveData<>();
var userList : ArrayList<User>? = null
userApi.getAllUser().enqueue(object : Callback<ResponseBody> {
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
if (response.body() != null) {
data.postValue(response.body().);
}
}
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
data.postValue(null);
}
})
Log.e("this log", "shouldn't be above the logs in onResponse ")
}
}
终于在你的activity
mainViewModel.getUserList().observe(this,
Observer<ApiResponse> { apiResponse ->
if (apiResponse != null) {
// handle your response in case of success
}
else {
// call failed.
}
})