架构组件改造和 RxJava 2 错误处理

2024-03-04

我目前正在尝试使用来自改造和 Okhttp 的 API 请求在架构组件中实现新的 ViewModel,一切正常,但我不知道如何将错误响应从改造传递到LiveDataReactiveStreams.fromPublisher然后上游到片段中的观察者。这是我到目前为止所拥有的:

public class ShowListViewModel extends AndroidViewModel {

private final ClientAdapter clientAdapter;

private LiveData<List<Show>> shows;

public ShowListViewModel(Application application) {
    super(application);
    clientAdapter = new ClientAdapter(getApplication().getApplicationContext());

    loadShows();
}

public LiveData<List<Show>> getShows() {
    if (shows == null) {
        shows = new MutableLiveData<>();
    }

    return shows;
}

void loadShows() {
    shows = LiveDataReactiveStreams.fromPublisher(Observable.fromIterable(ShowsUtil.loadsIds())
            .subscribeOn(Schedulers.io())
            .flatMap(clientAdapter::getShowWithNextEpisode)
            .observeOn(Schedulers.computation())
            .toSortedList(new ShowsUtil.ShowComparator())
            .observeOn(AndroidSchedulers.mainThread())
            .toFlowable());
}

在片段中,我在 OnCreate 中使用以下内容设置了 viewModel:

ShowListViewModel model = ViewModelProviders.of(this).get(ShowListViewModel.class);
    model.getShows().observe(this, shows -> {
        if (shows == null || shows.isEmpty()) {
            //This is where we may have empty list etc....
        } else {
            //process results from shows list here
        }

    });

一切都按预期工作,但目前如果我们处于离线状态,那么改造会抛出runtimeException并崩溃。我认为问题就出在这里:

LiveDataReactiveStreams.fromPublisher(Observable.fromIterable(ShowsUtil.loadsIds())
            .subscribeOn(Schedulers.io())
            .flatMap(clientAdapter::getShowWithNextEpisode)
            .observeOn(Schedulers.computation())
            .toSortedList(new ShowsUtil.ShowComparator())
            .observeOn(AndroidSchedulers.mainThread())
            .toFlowable());
}

通常我们会使用 rxjava2 subscribe 并捕获来自改造的错误,但是当使用LiveDataReactiveStreams.fromPublisher https://developer.android.com/reference/android/arch/lifecycle/LiveDataReactiveStreams.html它为我们订阅了 flowable。那么我们如何将这个错误传递到这里:

model.getShows().observe(this, shows -> { //process error in fragment});


您需要将显示和错误包装到可以保存错误的类中,而不是仅通过 LiveData 对象公开显示列表。

根据您的示例,您可以执行以下操作:

    LiveDataReactiveStreams.fromPublisher(Observable.fromIterable(ShowsUtil.loadsIds())
            .subscribeOn(Schedulers.io())
            .flatMap(clientAdapter::getShowWithNextEpisode)
            .observeOn(Schedulers.computation())
            .toSortedList(new ShowsUtil.ShowComparator())
            .observeOn(AndroidSchedulers.mainThread())
            .map(Result::success)
            .onErrorReturn(Result::error)
            .toFlowable());

其中 Result 是保存错误或结果的包装类

final class Result<T> {

    private final T result;
    private final Throwable error;

    private Result(@Nullable T result, @Nullable Throwable error) {
        this.result = result;
        this.error = error;
    }

    @NonNull
    public static <T> Result<T> success(@NonNull T result) {
        return new Result(result, null);
    }

    @NonNull
    public static <T> Result<T> error(@NonNull Throwable error) {
        return new Result(null, error);
    }

    @Nullable
    public T getResult() {
        return result;
    }

    @Nullable
    public Throwable getError() {
        return error;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

架构组件改造和 RxJava 2 错误处理 的相关文章

随机推荐

  • 主构造函数内的 Scala 局部变量

    在 Scala 中如何在主构造函数中定义局部变量 我需要解决这个练习Scala for the impatient book 编写一个具有接受字符串的主构造函数的 Person 类 包含名字 空格和姓氏 例如 new 人 弗雷德 史密斯 提
  • Kafka 主题分区

    关于 Kafka 主题和分区的一个简单问题 假设以下场景 Producer1将数据写入Topic1 Producer2向Topic2写入数据 Consumer读取Topic 1和Topic 2的数据 Consumer2仅从Topic2读取数
  • S 的最长平衡子序列

    给出的问题 一串括号据说是 如果字符串中的左括号和右括号可以正确配对 则为平衡 例如 字符串 和 都是平衡的 而字符串 则不是 均衡 给定一个字符串S长度n由括号组成 假设你想找到最长的子序列S这是平衡的 使用动态规划 设计一个算法来找到最
  • 从 Resteasy 服务器返回文件

    你好 我想从 Resteasy 服务器返回一个文件 为此 我在客户端有一个链接 它使用 ajax 调用休息服务 我想在其余服务中返回文件 我尝试了这两段代码 但都没有按照我想要的方式工作 POST Path exportContacts p
  • 仅加载关系的 id(pluck)

    我有一个简单的应用程序 使用 Laravel 5 5 13 public function index return Pet all 这列出了所有宠物 我有多对多关系 其中许多用户可以拥有同一只宠物 宠物的人类家庭 我想加载这些用户 Doi
  • 文件夹如何工作?

    谁能解释一下怎么做foldr http haskell org ghc docs latest html libraries base Prelude html v foldr work 举这些例子 Prelude gt foldr 54
  • 如何在phar文件代码中获取.phar文件真实目录?

    我正在尝试创建一个php可执行文件 phar文件 来生成一些文件 我想知道如何获取phar文件的真实路径 在phar文件代码内 我想要做的是在phar文件的同一级别创建一个文件夹并在那里创建新文件 但是realpath DIR 似乎不起作用
  • Git:“工作树”到底是什么?与“工作目录”相同吗?

    我正在阅读大量有关 Git 的文档 最近我一直在寻找 工作树 概念 但我不明白 工作树 到底是什么 我找到了这样的描述 什么是工作树 https mijingo com blog what is the working tree in gi
  • 在 ActionScript 2.0 中按程序访问函数的参数列表

    我已经可以通过执行类似以下操作来获取类中的所有函数 for var member in obj if obj member instanceof Function var f Function obj member 有没有办法在动作脚本中获
  • Haskell、Lisp 和冗长[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 生产中的 Azure SDK 2.2:无法加载文件或程序集“msshrtmi”或其依赖项之一。该系统找不到指定的文件

    我在 StackOverflow 和其他网站上的其他几个线程中读到过有关此问题的信息 其他解决方案都没有解决我的问题 而且大多数都已经过时 引用了旧版本的 Azure SDK 我有一个部署到 Azure 的典型 Azure 网站角色 该角色
  • Postgrex.Error ERROR 42501 unavailable_privilege 无法创建扩展 citext

    我正在尝试创建迁移 这是输出 MIX ENV prod DATABASE URL URL mix ecto migrate info execute CREATE EXTENSION citext Postgrex Error ERROR
  • Firebase 快照顺序错误

    我尝试将存储在 firebase 上的帖子加载到我的 tableView 中 我使用 childAdded 函数按照发布的顺序 从第一个到最后一个 获取帖子 起初它似乎有效 但现在不再有效 我不知道为什么 因此 我在帖子中添加了时间戳并使用
  • 弯曲等高列,但尊重另一列的最大高度[重复]

    这个问题在这里已经有答案了 我如何使下面的代码仅使用CSS flex 而不使用Javascript 第二列有动态内容列表 我需要根据第一列的高度应用滚动条 HTML div class row d flex div class col lg
  • 是否存在类似于 Nonetype 路径的东西?

    在我的课程中 我喜欢用 None 来启动我的路径变量 如果我使用os path很容易与其他路径进行比较 但我更喜欢pathlib风格 有没有解决方案可以做到这一点 import os path1 os path dirname D test
  • Selenium Grid:org.openqa.selenium.WebDriverException:转发新会话时出错用于设置功能的 VM 池为空

    我正在尝试使用 Cucumber 在硒网格上进行 POC 我收到此错误 转发新会话时出错 用于设置功能的虚拟机池为空 这是我的示例代码 公共静态无效configureServer GridHubConfiguration gridHubCo
  • 为什么 Swift 的 AVPlayer 在一场比赛中会加载两次playerItem?

    我正在使用 AVFoundation 的 AVPlayer 来流式传输外部 mp3 文件 我的后端有一个计数器 可以计算文件加载的次数 该服务的唯一客户端只有我一个 每当我触发播放 AVPlayer 时 计数器就会增加 2 这意味着 AVP
  • 使用 Bootstrap Accordion 添加向右箭头

    我想看看是否可以在 Bootstrap Accordion 标题的右侧添加箭头 我希望箭头在手风琴折叠时从下变为向上 这很复杂吗 我只希望标题带有箭头 并让它们在折叠时发生变化 但我在试图解决这个问题时遇到了最大的麻烦 这是代码 Accor
  • 使用 R 优化/向量化数据库查询

    我正在尝试使用 R 查询大型数据库 由于数据库的大小 我编写了一次获取 100 行的查询 我的代码如下所示 library RJDBC library DBI library tidyverse options java parameter
  • 架构组件改造和 RxJava 2 错误处理

    我目前正在尝试使用来自改造和 Okhttp 的 API 请求在架构组件中实现新的 ViewModel 一切正常 但我不知道如何将错误响应从改造传递到LiveDataReactiveStreams fromPublisher然后上游到片段中的