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进行顺序调用 的相关文章

随机推荐

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

    平台 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