【问题标题】:Android: How can I use send data from Room to Retrofit without LiveData?Android:如何在没有 LiveData 的情况下使用从 Room 发送数据到 Retrofit?
【发布时间】:2020-09-21 09:42:31
【问题描述】:

我的情况是我试图从我的 Room 数据库中获取字符串列表 List<String> 并将其发送到 Retrofit 以检索信息。

我不想使用 LiveData,因为我需要在 View 中有一个嵌套的观察者来观察数据库中的数据,另一个来从 Retrofit 中获取数据列表。

我正在尝试使用协程,但不确定如何在 viewModelScope.launch 函数最终完成获取值时返回数据。

【问题讨论】:

    标签: android kotlin retrofit2 android-room


    【解决方案1】:

    我不想使用 LiveData,因为我需要在 View 中有一个嵌套的观察者来观察数据库中的数据,另一个来从 Retrofit 中获取数据列表。

    您可以将观察者定义为顶级类,而不是嵌套它们。您可以将其作为与使用它们的类相同的文件中的私有类或作为单独文件中的公共类来执行此操作。如果您关注的是一个过于复杂、嵌套深度、长的源文件,这是一个很好的解决方案。如有必要,它将允许您更轻松地共享代码。

    例如,如果您的视图中有以下观察者:

    final Observer<String> nameObserver = new Observer<String>() {
        @Override
        public void onChanged(@Nullable final String newName) {
            // Update the UI, in this case, a TextView.
            nameTextView.setText(newName);
        }
    };
    

    然后你创建一个命名类:

    class MyObserver extends Observer<String> {
        @Override
        public void onChanged(@Nullable final String newName) {
            // Update the UI, in this case, a TextView.
            nameTextView.setText(newName);
        }
    }
    

    然后在你看来:

    final Observer<String> nameObserver = new MyObserver();
    

    如果您坚持避免使用LiveData,您可以使用AsyncTask 做您想做的事情,或者推出您自己的线程实现。

    【讨论】:

    • 感谢您的快速回复!我如何让他们成为顶级课程?通过覆盖方法?
    • @efoc 你已经在重写方法了,对吧?最大的不同是你必须给这个类起个名字。
    • 感谢您的示例!我认为我的问题是我不希望它被嵌套。我认为像 AsyncTask 这样的东西会起作用,所以我会进一步研究!
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2011-04-27
    相关资源
    最近更新 更多