2017-03-17 1 views
0

ok, donc j'essaie d'implémenter rxJava2 avec retrofit2. Le but est de faire un appel une seule fois et de diffuser les résultats dans différentes classes. Par exmaple: J'ai une liste de geofences dans mon backend. J'ai besoin de cette liste dans mon MapFragment pour les afficher sur la carte, mais j'ai également besoin de ces données pour définir le service pendingIntent pour le déclencheur réel.Android Seul observateur avec plusieurs abonnés dans des classes distinctes

J'ai essayé la suite de cette awnser, mais je reçois toutes sortes d'erreurs: Single Observable with Multiple Subscribers

La situation actuelle est la suivante:

GeofenceRetrofitEndpoint:

public interface GeofenceEndpoint { 
    @GET("geofences") 
    Observable<List<Point>> getGeofenceAreas(); 
} 

GeofenceDAO:

public class GeofenceDao { 
    @Inject 
    Retrofit retrofit; 
    private final GeofenceEndpoint geofenceEndpoint; 

    public GeofenceDao(){ 
     InjectHelper.getRootComponent().inject(this); 
     geofenceEndpoint = retrofit.create(GeofenceEndpoint.class); 
    } 

    public Observable<List<Point>> loadGeofences() { 
     return geofenceEndpoint.getGeofenceAreas().subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .share(); 
    } 
} 

MapFragment/toute autre classe où je dois les résultats

private void getGeofences() { 
    new GeofenceDao().loadGeofences().subscribe(this::handleGeoResponse, this::handleGeoError); 
} 

private void handleGeoResponse(List<Point> points) { 
    // handle response 
} 

private void handleGeoError(Throwable error) { 
    // handle error 
} 

Qu'est-ce que je fais mal, parce que quand je l'appelle new GeofenceDao().loadGeofences().subscribe(this::handleGeoResponse, this::handleGeoError); qu'il fait un appel séparé à chaque fois. Thx

Répondre

1

new GeofenceDao().loadGeofences() renvoie deux instances différentes du Observable. share() ne s'applique qu'à l'instance, pas à la méthode. Si vous voulez réellement partager l'observable, vous devez vous abonner à la même instance. Vous pouvez le partager avec un membre (statique) loadGeofences.

private void getGeofences() { 
    if (loadGeofences == null) { 
     loadGeofences = new GeofenceDao().loadGeofences(); 
    } 
    loadGeofences.subscribe(this::handleGeoResponse, this::handleGeoError); 
} 

Mais attention à ne pas fuir le Obserable.

0

Peut-être pas répondre à votre question directement, mais je voudrais vous suggérer une approche un peu différente:

Créer une BehaviourSubject dans votre GeofenceDao et abonnez-vous votre demande de mise à niveau à ce sujet. Ce sujet agira comme un pont entre vos clients et api, en faisant cela, vous réaliserez:

  1. cache de réponse - très pratique pour les rotations d'écran
  2. réponse Lecture de pour chaque observateur intéressé
  3. Abonnement entre les clients et sous réserve ne compte pas sur l'abonnement entre le sujet et l'API afin que vous puissiez en casser un sans en casser un autre