使用 RxJava 在本地和服务器之间同步记录
Sync Recrods Between Local And Server using RxJava
我正在尝试在本地记录和服务器上的记录之间同步一些数据。
syncList
是与本地记录同步操作的入口点。在这个方法中,我调用了一个方法 syncResultObservable
,它将 return Observable 对象与服务器上的记录。
从服务器下载记录后,我使用 flatmap
通过调用 syncResult (List<String> local, List<String> server)
将同步结果转换为 map<String, List<String>>
。
结果 map
应该有 2 个键
"toAdd":List<String>
"toRemove":List<String>
现在,我想对每个结果执行单独的操作。
recordsAddObservable
应该从 toAdd
键添加列表(我能够做到这一点)。
recordsRemoveObservable
应该从 toRemove
键中删除添加列表(找不到使用相同可观察对象执行此操作的方法)。
recordsAddObservable
操作 toAdd
记录对我来说工作正常。但是,我正在尝试找到一种方法来调用地图结果上的 recordsRemoveObservable
而不会导致整个同步操作再次开始以删除案例。
以下是 'toAdd' 条记录的小片段。
public void syncList(final List<String> localData) {
//fetch the server data
Observable<Map<String, List<String>>> syncResultObservable = serverDataDownloadObservable(userid)
.flatMap(new Func1<String[], Observable<Map<String, List<String>>>>() {
@Override
public Observable<Map<String, List<String>>> call(String[] serverData) {
Map<String, List<String>> map = syncResult(localData, Arrays.asList(serverData));
return Observable.just(map);
}
});
syncResultObservable.flatMap(new Func1<Map<String, List<String>>, Observable<List<String>>>() {
@Override
public Observable<List<String>> call(Map<String, List<String>> stringListMap) {
List<String> toAdd;
toAdd = stringListMap.get("toAdd");
if (toAdd == null || toAdd.isEmpty()) {
toAdd = new ArrayList<String>();
}
return Observable.just(toAdd);
}
}).flatMap(new Func1<List<String>, Observable<Result>>() {
@Override
public Observable<Result> call(List<String> strings) {
if (strings.isEmpty() == false) {
String[] toAdd = strings.toArray(new String[strings.size()]);
Log.i(LogEnum.LogPriority.info, getClass, "syncRecords: will try to add records ", toAdd);
return apis.recordsAddObservable(userid, toAdd);
}
Log.i("Tag", getClass, "syncRecords: no records to add, toAdd);
Log.i("Tag", getClass, "syncRecords: no records need to be added ");
return Observable.just(new Result(null, null));
}
}).subscribeOn(Schedulers.io()).subscribe(new Subscriber<Result>() {
@Override
public void onCompleted() {
//
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Result result) {
onCompleted();
}
});
}
public Map<String, List<String>> syncResult (List<String> local, List<String> server) {
. . .
. . .
Map<String, List<String>> map = new HashMap<>();
map.put("toAdd", toAddList);
map.put("toRemove", toRemoveList);
return map
}
如果有一种简单的方法可以对不同的结果集进行单独操作,请告诉我。
谢谢
大O
Here is 一个可运行的例子,我认为它可以做你想做的事:
- 获取本地值和服务器值的流,
- 申请他们的名单,
- 将它们压缩在一起并应用差异计算逻辑,
- 由于您选择使用具有特定键的映射,我们需要将其展平为键控流,
- 然后根据这两个键创建组,
- 并切换一个flatMap中的key来启动每个case需要的异步工作。
我就是这样解决的。
public void syncList(final List<String> localData) {
//fetch the server data
Observable<Map<String, List<String>>> syncResultObservable = serverDataDownloadObservable(userid)
.flatMap(new Func1<String[], Observable<Map<String, List<String>>>>() {
@Override
public Observable<Map<String, List<String>>> call(String[] serverData) {
Map<String, List<String>> map = syncResult(localData, Arrays.asList(serverData));
return Observable.just(map);
}
}).subscribeOn(Schedulers.io())
.subscribe(new Action1<Map<String, List<String>>>() {
@Override
public void call(Map<String, List<String>> stringListMap) {
List<String> toAdd = stringListMap.get("toAdd");
if (toAdd != null && toAdd.isEmpty() == false) {
} else {
addRecords(toAdd);
}
List<String> toRemove = stringListMap.get("toRemove");
if (toRemove != null && toRemove.isEmpty() == false) {
removeRecords(toRemove);
}
}
});
}
我正在尝试在本地记录和服务器上的记录之间同步一些数据。
syncList
是与本地记录同步操作的入口点。在这个方法中,我调用了一个方法 syncResultObservable
,它将 return Observable 对象与服务器上的记录。
从服务器下载记录后,我使用 flatmap
通过调用 syncResult (List<String> local, List<String> server)
将同步结果转换为 map<String, List<String>>
。
结果 map
应该有 2 个键
"toAdd":List<String>
"toRemove":List<String>
现在,我想对每个结果执行单独的操作。
recordsAddObservable
应该从 toAdd
键添加列表(我能够做到这一点)。
recordsRemoveObservable
应该从 toRemove
键中删除添加列表(找不到使用相同可观察对象执行此操作的方法)。
recordsAddObservable
操作 toAdd
记录对我来说工作正常。但是,我正在尝试找到一种方法来调用地图结果上的 recordsRemoveObservable
而不会导致整个同步操作再次开始以删除案例。
以下是 'toAdd' 条记录的小片段。
public void syncList(final List<String> localData) {
//fetch the server data
Observable<Map<String, List<String>>> syncResultObservable = serverDataDownloadObservable(userid)
.flatMap(new Func1<String[], Observable<Map<String, List<String>>>>() {
@Override
public Observable<Map<String, List<String>>> call(String[] serverData) {
Map<String, List<String>> map = syncResult(localData, Arrays.asList(serverData));
return Observable.just(map);
}
});
syncResultObservable.flatMap(new Func1<Map<String, List<String>>, Observable<List<String>>>() {
@Override
public Observable<List<String>> call(Map<String, List<String>> stringListMap) {
List<String> toAdd;
toAdd = stringListMap.get("toAdd");
if (toAdd == null || toAdd.isEmpty()) {
toAdd = new ArrayList<String>();
}
return Observable.just(toAdd);
}
}).flatMap(new Func1<List<String>, Observable<Result>>() {
@Override
public Observable<Result> call(List<String> strings) {
if (strings.isEmpty() == false) {
String[] toAdd = strings.toArray(new String[strings.size()]);
Log.i(LogEnum.LogPriority.info, getClass, "syncRecords: will try to add records ", toAdd);
return apis.recordsAddObservable(userid, toAdd);
}
Log.i("Tag", getClass, "syncRecords: no records to add, toAdd);
Log.i("Tag", getClass, "syncRecords: no records need to be added ");
return Observable.just(new Result(null, null));
}
}).subscribeOn(Schedulers.io()).subscribe(new Subscriber<Result>() {
@Override
public void onCompleted() {
//
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Result result) {
onCompleted();
}
});
}
public Map<String, List<String>> syncResult (List<String> local, List<String> server) {
. . .
. . .
Map<String, List<String>> map = new HashMap<>();
map.put("toAdd", toAddList);
map.put("toRemove", toRemoveList);
return map
}
如果有一种简单的方法可以对不同的结果集进行单独操作,请告诉我。
谢谢 大O
Here is 一个可运行的例子,我认为它可以做你想做的事:
- 获取本地值和服务器值的流,
- 申请他们的名单,
- 将它们压缩在一起并应用差异计算逻辑,
- 由于您选择使用具有特定键的映射,我们需要将其展平为键控流,
- 然后根据这两个键创建组,
- 并切换一个flatMap中的key来启动每个case需要的异步工作。
我就是这样解决的。
public void syncList(final List<String> localData) {
//fetch the server data
Observable<Map<String, List<String>>> syncResultObservable = serverDataDownloadObservable(userid)
.flatMap(new Func1<String[], Observable<Map<String, List<String>>>>() {
@Override
public Observable<Map<String, List<String>>> call(String[] serverData) {
Map<String, List<String>> map = syncResult(localData, Arrays.asList(serverData));
return Observable.just(map);
}
}).subscribeOn(Schedulers.io())
.subscribe(new Action1<Map<String, List<String>>>() {
@Override
public void call(Map<String, List<String>> stringListMap) {
List<String> toAdd = stringListMap.get("toAdd");
if (toAdd != null && toAdd.isEmpty() == false) {
} else {
addRecords(toAdd);
}
List<String> toRemove = stringListMap.get("toRemove");
if (toRemove != null && toRemove.isEmpty() == false) {
removeRecords(toRemove);
}
}
});
}