我正在尝试从使用普通改型迁移到使用RxJava扩展进行改型,以便在后台线程上进行API调用链。
例如,我有一个名为ModelGroup的对象,它有一个ModelPerson对象列表。我的目标是做到以下几点。
我目前的解决方案如下所示。
private void makeGroupInsert(ModelGroup modelGroup) {
int newGroupId = myApi.insertNewGroup(modelGroup.getName(), modelGroup.getRating())
.execute()
.body();
for (ModelPerson person : modelGroup.getPersons()) {
person.setGroupId(newGroupId);
String response = myApi.insertNewPerson(
person.getGroup_id(),
person.getFirst_Name(),
person.getLast_Name())
.execute()
.body();
if (!response.equals("success")) {
// One failed to update, send error to main thread.
}
}
// All succeeded, send success back to main thread.
}
问题
如何使用RxJava改造解决方案实现相同(或更好)的功能?
编辑1
MyApi的定义如下。
public interface MyApi {
@POST("insert_new_group")
Call<Integer> insertNewGroup(@Query("group_name") String groupName,
@Query("group_rating") int rating);
@POST("insert_new_person")
Call<String> insertNewPerson(@Query("group_id") int groupId,
@Query("first_name") String firstName,
@Query("last_name") String lastName);
}
首先,您需要将改造bean更改为使用可观察对象。例如,它可以类似于以下行:
@POST("insert_new_group")
Observable<Integer> insertNewGroup(...
然后您可以链接请求:
void updateData() {
myApi.insertNewGroup(modelGroup.getName(), modelGroup.getRating()) //Creating new group and getting its ID
.switchMap(this::setGroupIdAll) //Calling observable that will loop thru all persons and set their groupIDs
.subscribe(
(n) -> {/*you will get String after every 'insertNewPerson' run*/},
(e) -> {/*error handling*/}
);
}
Observable<String> setGroupIdAll(Integer id) {
return Observable.fromIterable(personsIterable) //personsIterable contains all your ModelPerson objects
.flatMap(this::updatePerson); //Call Observabl;e that will send updated person to the server
}
Observable<String> updatePerson(ModelPerson person) {
return myApi.insertNewPerson(
person.getGroup_id(),
person.getFirst_Name(),
person.getLast_Name());
}
foreach循环遍历列表值并将控制变量(var)依次设置为列表的每个元素 - 语法 (Syntax) Perl编程语言中foreach循环的语法是 - foreach var (list) { ... } 流程图 (Flow Diagram) 例子 (Example) #!/usr/local/bin/perl @list = (2, 20, 30, 40, 50); # foreach lo
除了前面介绍的几种循环语句外,C# 同样也支持 foreach 循环,使用 foreach 可以遍历数组或者集合对象中的每一个元素,其语法格式如下: foreach(数据类型 变量名 in 数组或集合对象){ 语句块; } foreach 会在每次循环的过程中,依次从数组或集合对象中取出一个新的元素放到 里定义的变量中,直到所有元素都成功取出后退出循环。 【示例】使用 foreach 循环
本文向大家介绍C# Foreach循环,包括了C# Foreach循环的使用技巧和注意事项,需要的朋友参考一下 示例 foreach将迭代实现的类的任何对象IEnumerable(请注意IEnumerable<T>从其继承的对象)。此类对象包括一些内置对象,但不限于:List<T>,T[](任何类型的数组),Dictionary<TKey, TSource>以及诸如IQueryable和IColl
Perl 循环 Perl foreach 循环用于迭代一个列表或集合变量的值。 语法 语法格式如下所示: foreach var (list) { ... } 流程图 Perl 循环
第一个API调用返回一个元素列表,然后我想随后调用另一个API,在第一个API调用的列表的每个元素中返回一个。我(想我)已经得到了它,所以它用列表的每个元素调用第二个应用编程接口调用,但是我不确定如何订阅它来获得第二个调用返回的结果。 改装接口: 我不确定从这里去哪里。 我相信然后使我能够获得可观察的