什么情况下onNext()可以被多次调用?

In what occasion can onNext() be called more than once?

我已经定义并连接了一个端点 returns 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有没有可能被调用了不止一次? 如果是,在什么场合?

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

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

例如使用改造:

@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);

每次您 insert/modify/delete FollowMeUser collection,getFollowMeUsers 的所有订阅者都会收到通知。

如果你改造 returns 一个 array/list 的数据,onNext 会被调用多次。 但是如果你改造 returns 单个数据对象,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 将只调用一次。