当前位置: 首页 > 知识库问答 >
问题:

如何让一个方法等到它的改造方法得到响应后再返回?

步博涉
2023-03-14

如何让一个函数等到它中的一个修改方法得到它的响应后再返回?

我见过很多关于堆栈溢出的问题和答案,但由于愚蠢或我没有完全得到它们。

我有一个视图模型,它给视图一个文本显示在屏幕上。

就像,我确实喜欢这个视图,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拒绝它。

谢谢你所有的评论和回答。

共有1个答案

强才捷
2023-03-14

因此您的视图模型将包含这个而不是您的函数

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.

            }
        })
 类似资料:
  • 问题内容: 我正在为该站点(Site1)中的页面编写Greasemonkey脚本。Site1提供各种交易和报价,而我的GM脚本旨在实现以下目的: 当一个人访问Site1上的报价时,脚本会查询 Site2,以查找该酒店是否也在Site2上列出。如果是这样,请在Site1上显示来自Site2的搜索结果。 问题是Site2显示进度条(“正在加载结果”),然后显示结果。因此,我的Ajax请求始终返回空结果

  • 问题内容: 在Android应用程序中,我想从方法返回JSONObject 。 这是代码: 我尝试了此代码,但出现错误。是否可以从方法返回JSONObject ? 问题答案: 编辑: 这可以帮助您, 很明显, 可能您不需要在方法声明中更改返回值和参数。 只需创建以下行 方法将根据您在中提到的参数和返回类型自动创建

  • 问题内容: 我知道有,但仅适用于覆盖其他方法的方法。 我有几个带有许多 委托 方法的类(它们 不会 覆盖其他方法)。 他们的Javadoc是否可以“继承”(更确切地说是复制)? 问题答案: @link或@see标记在这里比较合适。如果要包装该方法,则它必须提供独特的行为,这使其不适用于重载或其他情况。

  • 我有一个类,它有以下实现: 如您所见,方法调用,然后在返回结果之前执行一些逻辑。 当我试图模拟这个存储库进行单元测试时,我很难从中获得结果,因为它总是作为空引用异常而失败。 以下是单元测试: 如何使此测试工作,使模拟方法在调用被模拟的方法之后执行一些逻辑?

  • 我刚刚开始使用JProfiler(版本11.0.1)。在分析了我的测试应用程序(检测)后,我转到“CPU视图- A类 B类 所以,我的问题是在哪里寻找从ClassA发送到ClassB的数据大小? 提前谢谢。

  • 前情提要5.3: 我可以很容易地从JSON响应中获得PHP数组。现在在狂饮6,我不知道怎么做。似乎不再有方法了。我(快速)阅读了最新版本的文档,没有发现任何关于JSON响应的信息。我想我错过了一些东西,也许有一个新的概念我不明白(或者我没有正确阅读)。 这(下面)条新路是唯一的路吗? 或者有帮手之类的吗?