android livedata进行顺序调用

2024-03-17

我正在使用改造,实时数据。我的项目中有一种情况,我必须进行网络调用的顺序。如果任何一个失败,它应该返回错误。

目前我有两个实时数据观察者来完成工作,这不是一个好的方法,所以我想知道更好的方法或示例代码来处理这种需求。

注意:我没有使用 Rxjava。

查看代码 基本逻辑

    String id = "items/1233"; //ID which has to to be deleted
    if (isCustomizedItem) {
        viewModel.deleteEvent(id);
    } else {
        viewModel.createCustomItems();
        viewModel.deleteEvent(id);
    }

实时数据观察者

    viewModel.getItemDeleted().observe(this, serverResponse -> {
        if (serverResponse.status == Status.SUCCESS) {
            Timber.i("Successfully deleted");
        }
    });

    viewModel.itemCreated().observe(this, serverResponse -> {
        if (serverResponse.status == Status.SUCCESS) {
            Timber.i("new items added");
            //Again call delete for specific item
            viewModel.deleteEvent(id);
        }
    });

视图模型代码

    createItems = Transformations.switchMap(eventData, (data) -> {
        if (canCreateItems(data)) {
            return AbsentLiveData.create();
        } else {
            return eventItemRepository.createItems();
        }
    });

    deleteItem = Transformations.switchMap(deleteItem, (item) -> {
        if (!isValidItem(item)) {
            return AbsentLiveData.create();
        } else {
            return eventItemRepository.deleteItem(item);
        }
    });

回购代码。

public LiveData<Resource<List<Items>>>  createItems() {
    return new NetworkBoundResource<List<Items>> (executors) {
        @NonNull
        @Override
        protected LiveData<ApiResponse<List<Items>>> createCall() {
            return services.createItems();
        }
    }.asLiveData();
}
public LiveData<Resource<EmptyResponse>>  deleteItem(String id) {
    return new NetworkBoundResource<EmptyResponse> (executors) {
        @NonNull
        @Override
        protected LiveData<ApiResponse<EmptyResponse>> createCall() {
            return services.deleteItem(id);
        }
    }.asLiveData();
}

服务接口。

@GET(Constants.API_PATH+"/createitems/")
LiveData<ApiResponse<List<Items>>> createItems();

@GET(Constants.API_PATH+"/delete/{id}")
LiveData<ApiResponse<EmptyResponse>> deleteItem(@Path("id") String id);

我想一起调用createItems 和deleteItem。我怎样才能做到这一点?


最后我写下解决方案。我使用 Mediatorlivedata 来观察视图模型上的实时数据变化。

负责网络调用的方法

public LiveData<Resource<EmptyResponse>> updateEvent(RequestCustomEvent request) {
    return new UpdateItineraryRequests<EmptyResponse>(request).asLiveData();
}

以及一个将观察视图模型上实时数据变化的类。

   private class UpdateItineraryRequests<RequestType> {
    private final MediatorLiveData<Resource<RequestType>> result = new MediatorLiveData<>();

    UpdateItineraryRequests(RequestCustomEvent request) {
        startExecution(request);
    }

    void startExecution(RequestCustomEvent request) {
        //First check the its custom or not if its custom then directly change.
        if (request.isCustom()) {
            LiveData<Resource<EmptyResponse>> observable = repo.deleteItem(request.getEventID());
            result.addSource(observable, response -> {
                result.removeSource(observable);
                if (response.status == Status.SUCCESS) {
                    result.setValue(Resource.success(null));
                } else {
                    result.setValue(Resource.error("unable to delete", null));
                }

            });
        } else {
            LiveData<Resource<List<Items>>> itemsObservable = repo.createItems(request.getDataToChange());
            result.addSource(itemsObservable, response -> {
                result.removeSource(itemsObservable);
                LiveData<Resource<EmptyResponse>> observable = repo.deleteItem(request.getEventID());
                result.addSource(observable, response -> {
                    result.removeSource(observable);
                    if (response.status == Status.SUCCESS) {
                        //Do rest of network calls
                    }

                }
            });
        }

    }

    LiveData<Resource<RequestType>> asLiveData() {
        return result;
    }

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

android livedata进行顺序调用 的相关文章

  • 单击应用程序的启动图标时会发生什么?

    单击应用程序的启动图标时会发生什么 是否总是发送新意图 或者结果有时与从最近的任务恢复任务相同 如果发送意图 它何时被发送到新活动实例的 onCreate 方法以及何时通过现有活动的 onNewIntent 进行路由 假设意图通过任务中现有
  • 如何在 Android 中的 onCreate() 内部创建方法

    如何在里面创建一个方法onCreate 方法 当我创建它的显示错误时 令牌 void 预期存在语法错误 并且如果无法在内部创建方法onCreate 方法比请告诉我如何在外部创建方法onCreate 并通过mContext and mActi
  • 如何列出我的应用程序以供下载文件?

    我想通过我的应用程序从浏览器下载文件 我正在尝试将我的应用程序列在complete action using对话 它显示其他操作 例如查看文件等 但在下载文件的情况下 它不会显示在对话框中 我怎样才能像图片中那样列出我的应用程序 我在我的活
  • 任务执行失败 程序类型已存在

    我将这个新库包含到我的依赖项中 compile com github Triggertrap SeekArc v1 1 然后当我构建时出现构建错误 Error Exception in thread queued resource proc
  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • 对齐卡片视图中的项目

    我希望我的卡片如下所示 我保持这样的布局
  • 如何以编程方式在 Android 中查找平板电脑或手机?

    我的情况是 手机和平板电脑的逻辑是相同的 但布局上略有不同 我尝试使用以下代码 public static boolean findoutDeviceType Context context return context getResour
  • 如何修复 Android 7.0 的 Spinner 模式下的 DatePickerDialog?

    我目前正在开发一个简单的项目 其中包含一个包含在 Web 视图中的网站 具有少量交互 以提高网站本身和 Android 移动设备之间的交互性 由于该网站包含用户生日的日期输入字段 因此我希望实现一个与所有设备兼容的旋转格式的日期选择器 我尝
  • Flutter - 选择 TextFormField 时键盘不显示

    我目前遇到一个问题 当我选择任何一个时 键盘不会出现TextFormFielda 内的小部件Form小部件 这是表单的代码 位于我的内部CreateAccountForm有状态的小部件 import package flutter mate
  • 输入连接-如何删除选定的文本?

    我为 Android 制作了一个自定义键盘 当我按下键盘的退格按钮时 我使用 getCurrentInputConnection deleteSurroundingText 1 0 从输入字段中删除一个字母 但是 当我选择一些文本然后按退格
  • 动态选取框文本

    是否可以将列表视图的 java 编码中的文本添加到 Android 中的选取框滚动中 如果可以 请告诉我如何做 如果需要 我将发布使用的代码 这是列表视图使用的 XML 如下
  • Android Realm.io:行/对象不再有效

    这是我的删除功能 它确实找到了workday1 object public static void delete Context context Workday workday Realm realm getRealm context re
  • 如何在警报对话框中为图像按钮设置 onclick 侦听器

    我有一个带有 ImageButton 的布局 该布局在 AlertDialog 中膨胀 我应该在哪里 如何设置 onClick 侦听器 这是我尝试使用的代码 ImageButton ib ImageButton findViewById R
  • 在哪里可以获得用于导入 libcore.io 的 JAR?

    我想处理一个GaiException在我的应用程序中 调试器告诉我 它位于 libcore io 包中 但导入它会产生错误 我想我需要向我的项目添加一个额外的 JAR 才能正确解析此类型 我在我的 android sdk 文件夹中进行了一些
  • jQuery mobile - 仅在侧面板关闭时才允许滚动?

    我不希望用户在任何侧边栏打开时滚动 一旦关闭 他们应该滚动 我使用了下面的代码 但它不适用于 Android 移动设备 document bind panelopen function e data body css overflow hi
  • 使用 qbs 构建 qt 应用程序

    我想知道在 Linux 上使用 qbs 编译 构建和创建 Android Qt 应用程序的步骤 我拥有所有必要的工具 目前我可以使用 qmake 创建 apk Qbs 目前不支持构建 Qt Android 应用程序 Qbs v1 4 中引入
  • 查找配对的 Android 蓝牙设备是否在范围内的正确方法?

    我想编写一个充当蓝牙客户端的应用程序 我想做的是找出最好的方法来确定我支持的特定设备是否在范围内 而不是一直尝试在其上执行 BluetoothDevice connect 并失败如果不在范围内 这里我们假设设备已经配对 恐怕在特定设备处于范
  • 从包中发布的错误通知无法展开 RemoteViews

    我有个问题 有时我的服务会被这个 logcat 强制关闭 03 26 20 44 44 849 E AndroidRuntime 12080 FATAL EXCEPTION main 03 26 20 44 44 849 E Android
  • 如何减少导航图标和工具栏标题之间​​的差距?

    我的问题是导航抽屉图标和工具栏标题之间 有多余的空间 示例图像如下 工具栏的xml视图是
  • Libgdx 和 Google 应用内购买结果

    我遵循了这些指示 https github com libgdx libgdx wiki Interfacing with platform specific code使用 ActionResolver 接口集成 Libgdx 和原生 An

随机推荐

  • 谷歌应用程序引擎中的选择属性

    平台 django 1 0 谷歌应用程序引擎 app engine patch python 2 5 4 我正在尝试使用 Choice 属性 就像我一直在 django 网站中使用的那样 STATUS CHOICES 1 Yet To St
  • 无法使用 GetManifestResourceStream() 加载清单资源

    我使用 XSD 创建了一个自定义配置部分 为了解析遵循这个新架构的配置文件 我使用以下内容加载资源 我的 xsd 文件 public partial class MonitoringConfiguration public const st
  • 如何使用Python进行大规模开发?

    我有兴趣了解 Python 的大规模开发 特别是如何维护大型代码库 当您对方法的签名进行不兼容的更改时 如何找到调用该方法的所有位置 在C Java中 编译器会为你找到它 那么在Python中你如何做到这一点呢 当您在代码深处进行更改时 由
  • 使用自动更新计数器保持 $SESSION 活动

    我希望将会话保持三天 并且每当他们访问该页面时 它就会再次更新最多三天 基本上 如果他们三天不访问该网站 他们的会话就会下降 ini set session cookie lifetime 60 60 24 3 saw on a simil
  • 在单独的线程中运行 SimpleXMLRPCServer 并关闭

    我有一个类 我希望通过 python 中的 SimpleXMLRPCServer 进行测试 我设置单元测试的方法是创建一个新线程 并在其中启动 SimpleXMLRPCServer 然后我运行所有测试 最后关闭 这是我的服务器线程 clas
  • 带有图像背景和鼠标绘制的面板

    如果 Paint 方法已用于其他目的 如何在 JPanel 中使用图像作为背景 我试图在面板中绘制图像 这是我用铅笔绘制的代码 但我不知道如何添加图像作为背景 Override public void paint Graphics g if
  • 将环境变量传递给角度库

    我使用 angualr2 library yeoman 生成器创建了公司内部库 一些 Angular 服务在我们当前的应用程序中使用环境变量 API 端点在每个环境上都会更改 我想知道将当前环境对象传递给 angular2 库服务的最佳方法
  • 如何在ng bootstrap的输入中设置日期格式

    我在用NG引导程序 https ng bootstrap github io components datepicker日期选择器 我想在输入标签中设置日期格式 这是我的html代码
  • 将盲文字符打印到 cmd c++

    对于一个程序 我需要将盲文字符输出到控制台 我找到了一种使用如下代码输出 unicode 字符的方法 include
  • onCreateDrawableState 永远不会调用

    我必须向RelativeLayout 添加新状态 但永远不会调用onCreateDrawableState 方法 我的班级是 public class UnreadableRelativeLayout extends RelativeLay
  • java.lang.ClassCastException:无法转换 java.util.LinkedHashMap

    javascript ajax headers Accept application json Content Type application json url realgrid product addOd do type post da
  • SqlDataAdapter.Fill() 超时 - 底层存储过程快速返回

    我有一个 SqlDataAdapter 其中填充了 21 行数据 4 列 驱动它的存储过程会在几秒钟内返回 SQL Mgmt Studio 但 Fill 需要 5 分钟 ArrayList ret new ArrayList SqlData
  • iOS - CALayer 和手势/滑动识别器

    我在视图中添加了一个图层来创建渐变背景色 但我需要使用UISwipeGestureRecognizer在我看来 问题是 现在有了图层 滑动识别器就不起作用了 我能怎么做 我可以向图层添加滑动识别器吗 谢谢 CALayer及其孩子不支持UIG
  • 对象字面量中的括号

    对象字面量中的括号只是分组运算符吗 节点字符串化 https github com fuqcool node stringify将转换 a 1 到字符串 a 1 a 2 我是否可以认为这里的括号对数据没有影响 即即使没有括号也完全相同 Ye
  • 最小宽度媒体查询在 ipad 上不起作用?

    为什么在横向模式下的 iPad 上无法拾取以下媒体查询 media all and min device width 1000px css here Or media all and min width 1000px css here 我希
  • Django:无法将关键字“”解析为字段。选项有:

    我在访问时遇到这个奇怪的问题ManyToManyField 我有以下型号 class Link models Model title models CharField max length 200 url models URLField u
  • 将 uri 传递给另一个 Activity 并将其转换为图像

    如何发送uri图像到另一个活动的路径并将其转换为图像 我尝试了下面的 protected void onActivityResult int requestCode int resultCode Intent data super onAc
  • 使用 SQL 和 PHP 将数据从页面传递到引导模式

    因此 根据标题 我尝试在引导模式上使用 sql 来传递显示数据库中的多个数据 ID会从链接中传递下来 是怎么做到的呢 一直在寻找多种方法 但我仍然无法显示所选数据 所以这是模式的触发器 tr td style text align cent
  • VB6在制作exe文件时冻结

    我正在用 VB6 编写一个项目 我使用的是 Win7 32 位 项目有问题 这个项目是很多年前写的 现在我正在重新编译它 当我发出 Make xxx exe 命令时 VB6 开始编译并冻结 还创建了超过 10 000 个 tmp 文件 几分
  • android livedata进行顺序调用

    我正在使用改造 实时数据 我的项目中有一种情况 我必须进行网络调用的顺序 如果任何一个失败 它应该返回错误 目前我有两个实时数据观察者来完成工作 这不是一个好的方法 所以我想知道更好的方法或示例代码来处理这种需求 注意 我没有使用 Rxja