Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在viewmodel中使用mediatorlivedata对事件排序时如何避免回调地狱_Android_Android Livedata - Fatal编程技术网

Android 在viewmodel中使用mediatorlivedata对事件排序时如何避免回调地狱

Android 在viewmodel中使用mediatorlivedata对事件排序时如何避免回调地狱,android,android-livedata,Android,Android Livedata,我正在使用谷歌提供的架构最佳实践编写一个android应用程序。我使用了调用viewmodel的活动,该活动在内部调用存储库。在其中一个业务流程中,我需要执行以下一系列步骤: 1) 从返回liveData的SQLite mobile数据库中的表1中获取数据 2) 基于SQLite数据库中表1中的字段,我需要对网络进行API调用以获取一些值 3) 一旦我从网络中得到结果,我需要更新表2和表3 现在,由于需要对调用进行排序,我正在使用MediatorLiveData添加源和onChange。但是,为

我正在使用谷歌提供的架构最佳实践编写一个android应用程序。我使用了调用viewmodel的活动,该活动在内部调用存储库。在其中一个业务流程中,我需要执行以下一系列步骤:

1) 从返回liveData的SQLite mobile数据库中的表1中获取数据

2) 基于SQLite数据库中表1中的字段,我需要对网络进行API调用以获取一些值

3) 一旦我从网络中得到结果,我需要更新表2和表3

现在,由于需要对调用进行排序,我正在使用MediatorLiveData添加源和onChange。但是,为了对调用进行排序,我需要继续在onchanged方法中编写代码,这会导致回调地狱问题

由于我是Android开发的新手,有人能指导我如何正确地解决Android中的调用嵌套问题吗。我需要用RxJava2吗?作为android架构指南,只告诉我们LiveData,我想知道是否有更干净的方法可以使用LiveData

//从SQLite获取数据

LiveData liveData1=repository.getTable1Record()

addSource(liveData1,newobserver()){


}))

我认为
LiveData
不适合这种情况,因为每个请求都会执行一次任务。如果不使用
LiveData
,您可以更轻松地完成所要做的事情。如果您必须使用
LiveData
,那么有一些有用的库允许您使用类似RxJava的运算符,例如。感谢Sanlok提供的见解。我使用LiveData作为启动此流的活动,依赖于此流的响应,并根据响应更新UI。为了避免活动中的任何内存泄漏被破坏,我更喜欢LiveData。关于您提供的API,能否提供一个如何链接请求的示例。我发现在RxJava中,我们可以使用flatMap函数来链接请求,所以这里有没有任何等效的函数可以帮助我。谢谢
  @Override public void onChanged(@Nullable Table1Row row) {
      liveDataMerger.removeSource(liveData1);
      // Fetch data from network
      LiveData liveData2 = repository.getRecordFromServerOverNetwork();
      liveDataMerger.addSource(liveData2, new Observer() {
           @Override public void onChanged(@Nullable Table1Row row) {
               liveDataMerger.removeSource(liveData2);
               // Fetch data from database again from another table
               LiveData liveData3 = repository.getTable2Record();
               liveDataMerger.addSource(liveData3, new Observer() {
                @Override public void onChanged(@Nullable Table2Row row) {
                  liveDataMerger.setValue(row.MyValue);
               }
              }
           }
      }
  }