我有一个项目列表,对于我想要执行异步作业的每个项目,然后更新UI。我正在使用rxjav来执行异步任务。我如何遍历列表并执行此操作。我尝试使用Observable.FromArray认为它没有用
Observable.fromArray
答案 0 :(得分:1)
flatMap
是你的答案。您将列表传递给Observable
,在flatMap
中,列表中的每个项目都将被传递,以便您可以执行异步任务。最后,您可以更新UI。
Observable.fromArray(yourArrayList)
.flatMap(item -> doAsyncTask)
.flatMap(item -> updateUI)
.subscribe();
您可以参考marble diagram了解flatMap
的工作原理。
答案 1 :(得分:0)
你需要使用.flatMap()。 Flatmap将允许您执行操作并为每个项目发出一个可观察对象。您可以使用它对列表中的每个项目执行异步操作。平面地图操作可以返回相同类型或其他类型的项目。
实施例: 假设您有一个Object1类型的项目列表。您希望将这些上载到REST API。 API将在响应中返回上传的对象。
// Create observable
Observable<Object1> uploadObjects = Observable.fromIterable(objectsToUpload)
.flatMap(object -> {
// Calls uploadObject on each item in the list
return MyAPI.uploadObject(object);
})
.subscribeOn(Schedulers.io()) // Performs the action on background thread
.observeOn(AndroidSchedulers.mainThread()); // Returns result on UI thread
// Subscribe to observable
Disposable subscription = uploadObjects
.subscribe(returnedObject -> {
// Called for each returned object
// Update UI here
}, throwable -> {
// Handle error here
}, () -> {
// Runs after all items completed
});
假设MyAPI.uploadObject()
将Object1
作为参数但返回不同类型的对象:键入Object2
。如果是这种情况,那么uploadObjects
observable只需要是Observable<Object2>
类型。然后订阅块中的每个returnedObject
都是Object2
类型。
Dan Lew的一些不错的例子可以找到here。