2017-01-05 7 views
0

Я определил и интерфейс, с конечной точкой, которая возвращает JSON. «Дооснащение» преобразует этот JSON в MyObject. Это может быть также список, карта и т. Д., Теперь это не имеет значения.В каком случае можно называть onNext() более одного раза?

Вот как я подписываюсь.

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 называется более чем один раз? Если да, то в каком случае?

+0

Возможно, вы захотите использовать 'Single' вместо' Observable' в вашем интерфейсе MyApi. С 'Single',' onNext' вызывается хотя бы один раз (или это ошибка) – dwursteisen

ответ

1

В вашем случае нет, это невозможно, конечно, если вы не испускаете больше предметов в методе doSomething().

Но есть и другие, вполне обычные случаи, например, если вы используете подход Local first и подписываетесь на hot наблюдаемый, который будет излучать новый элемент каждый раз, когда данные в базе данных меняются.

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 будут уведомлены.

0

Если ваш retrofit возвращает массив/список данных, onNext вызывается несколько раз. Но если ваша модификация возвращает одиночный объект objext, 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 будет вызываться только один раз. ,