android:调用rxjava获取项目列表

时间:2018-03-06 22:09:20

标签: android list rx-java

我有一个项目列表,对于我想要执行异步作业的每个项目,然后更新UI。我正在使用rxjav来执行异步任务。我如何遍历列表并执行此操作。我尝试使用Observable.FromArray认为它没有用

 Observable.fromArray

2 个答案:

答案 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