2014-05-18 6 views
0

J'utilise Rx-Java pour effectuer un appel api pour chaque élément d'un tableau. Je souhaite que l'action OnComplete soit appelée une fois que toutes les opérations sont terminées mais que l'appel n'est pas effectué. Les opérations sur les éléments de tableau se terminent correctement.En utilisant Observable.from et flatMap pour effectuer une opération sur chaque élément d'un tableau, onComplete n'est pas appelé

public Observable<User> report(Long[] userIds) { 
    return Observable.from(userIds).flatMap(new Func1<Long, Observable<User>>() { 
     @Override 
     public Observable<User> call(Long id) { 
      return reportSpam(id); 
     } 
    }); 
} 

public Observable<User> report(final Long id) { 
    return Observable.create(new Observable.OnSubscribe<User>() { 
     @Override 
     public void call(Subscriber<? super User> subscriber) { 
      try { 
       twitter.report(id); 
      } catch (TwitterException e) { 
       subscriber.onError(e); 
      } 
     } 
    }); 
} 

final Long[] usersIds = selectedToUsersIds(); 

report(usersIds).subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<User>() { 
     @Override 
     public void call(User user) { 
      //nothing to do here, don't even need the User 
     } 
    }, new Action1<Throwable>() { 
     @Override 
     public void call(Throwable throwable) { 
     //handle this 
     } 
    }, new Action0() { 
     @Override 
     public void call() { 
      Toast.makeText(getActivity(), getString(R.string.reported_for_spam, usersIds.length), Toast.LENGTH_SHORT).show(); 
     } 
}); 

Répondre

1

Vous devez appeler subscriber.onCompleted() en Observable<User> report(final Long id). Un Observable doit toujours appeler onCompleted ou onError à la fin du flux.

Questions connexes