Android使用RXJava,如何使用带有整数列表的Observable并将其转换为对象列表

时间:2014-08-10 23:30:15

标签: android rx-java

所以这就是我到目前为止......

    public Observable<List<Integer>> getIds() {

        return Observable.create(new Observable.OnSubscribe<List<Integer>>() {
            @Override
            public void call(Subscriber<? super List<Integer>> subscriber) {
                try {
                    subscriber.onNext(mSource.getIds());
                } catch (Exception e) {
                    subscriber.onError(e);
                }
            }
        });
    }

这很好用,并为我提供了我试图创建的对象的ID列表

然后我需要一个函数来返回带有对象列表的Observer的订阅。我需要对getObject(int id)进行单独的api调用以获取每个对象。

    public Subscription getObjectList(Observer<List<Object>> observer) {
        return  mService.getIds()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())

            // here is where i get lost...
            .map(new Func1<Observable<Integer>, Observable<List>>)

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

好吧,因为您的getIds()方法返回Observable<List<Integer>>,在Func1中创建map的正确方法将是

.map(new Func1<List<Integer>, List<Object>>() {

它接受一个整数列表,并将发出一个对象列表。我相信这正是你想要实现的目标。你的最终代码可能看起来像这样

public Subscription getObjectList(Observer<List<Object>> observer) {
    return getIds()
            .map(new Func1<List<Integer>, List<Object>>() {
                @Override
                public List<Object> call(List<Integer> integers) {
                    List<Object> objects = new ArrayList<Object>();
                    for (Integer id : integers) {
                        // Here's where you map each ids to an object and add it to the list
                        objects.add(getObject(id));
                    }
                    return objects;
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(observer);
}

// Add your own code here to load the object based on the id.
private Object getObject(Integer id) {
    return id;
}

// Replace with your own getIds from above
public Observable<List<Integer>> getIds() {
    return Observable.from(1, 2, 3).toList();
}

这应该可以帮助您开始使用,如果您有什么不明白的地方,请告诉我。