在什么场合可以多次调用onNext()?

时间:2017-01-05 15:48:56

标签: android rx-java retrofit2 rx-android

我已经定义并使用返回JSON的端点进行接口。 Retrofit将此JSON转换为MyObject。它也可以是一个列表,地图等,现在没关系。

这就是我订阅的方式。

    subscription = Retrofit.create(MyApi.class)
            .doSomething()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<MyObject>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(MyObject myObject) {

                }
            });

我的问题是:

是否有可能不止一次调用onNext? 如果是,在哪个场合?

2 个答案:

答案 0 :(得分:1)

在你的情况下,不可能,当然如果你不用doSomething()方法发出更多的项目。

但是还有另一个非常常见的情况,例如,如果你使用Local first方法并订阅hot observable,每次数据库中的数据发生变化时都会发出新项目。

E.g。使用改造:

@Override
public Observable<List<FollowMeUser>> getFollowMeUsers() {
    return realm.where(FollowMeUser.class)
            .findAll()
            .asObservable()
            .filter(RealmResults::isLoaded);
}

getFollowMeUsers()
.subscribe(users -> {Timber.d("saved data has changed")}, Timber::e);

每次您插入/修改/删除FollowMeUser集合时,都会通知getFollowMeUsers的所有订阅者。

答案 1 :(得分:0)

如果您的改造返回数据/数据列表,则多次调用onNext。 但是,如果您的改造返回单个数据对象,则onNext将仅被调用一次。 例如:

//POJO 
class User {
int userId;
String UserName;
}

//POJO 
class UserData {
List<User> users;
}

interface RetrofitGithub {
@GET("...")
Observable<List<User>> getUsers(); 

@GET("...")
Observable<UserData> getUserData(); 

}

如果您订阅了getUsers()onNext将被多次调用N次。(N =列表的大小)

如果您订阅了getUserData()onNext,则只会调用一次。