什么情况下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 将只调用一次。
我已经定义并连接了一个端点 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 将只调用一次。