2017-06-27 11 views
0

Supposons que nous ayons un rxjava observable comme un champ de classe:RxJava observable comme champ de classe

public class MyClass { 

    private final Observable<Integer> myObservable = Observable.just(1); 

    public Observable<Integer> getMyObservable() { 
     return myObservable; 
    } 
} 

Dans ce cas, il est juste un exemple de l'observable qui est partagée aux clients de classe.

Qu'en est-hits performances lors de retour toujours une nouvelle instance observable:

public class MyClass{ 

    public Observable<Integer> getMyObservable() { 
     return Observable.just(1); 
    } 
} 

Je demande parce que dans mon codebase j'ai beaucoup de ces qui sont créés observables et renvoyés sur l'appel de méthode. Je me demande si ce serait une bonne idée de créer des instances de classe qui sont ensuite renvoyées?

+0

retour myObservable; toujours retourner la même instance, quel est le problème? – paul

Répondre

1

Je ne pense pas qu'il y ait une grande différence en termes de performance. De toute façon je vois un problème dans la première implémentation: je pense que vous n'allez pas toujours utiliser 1 comme élément à émettre du Observable. Probablement, en effet, vous voulez quelque chose comme:

public class MyClass { 

    private int value = 100; 

    private final Observable<Integer> myObservable = Observable.just(value); 

    public Observable<Integer> getMyObservable() { 
     return myObservable; 
    } 
} 

Je veux dire, je me attendais à un paramètre de la classe à émettre, comme dans l'exemple.

Le problème avec ceci est que la valeur émise sera toujours 100, indépendamment de la prochaine valeur que la variable assumera. Voyons un exemple:

MyClass mc = new MyClass(); 
mc.getMyObservable().subscribe(value -> print(value)); 
mc.setValue(200); 
mc.getMyObservable().subscribe(value -> print(value)); 

Vous vous attendez à 100 et 200 à imprimer, mais ce que vous obtiendrez est un double 100. En effet, lorsque vous attribuez votre Observable.just(value) à la myObservable variable que vous fixons la valeur qui être émis toujours.

Pour éviter cela, vous pouvez utiliser defer opérateur:

private final Observable<Integer> myObservable = Observable.defer(() -> Observable.just(value)); 

Alors maintenant, l'élément émis par l'observable sera la valeur de votre variable au moment de l'abonnement.

REMARQUE: Vous pouvez obtenir le même résultat en utilisant l'opérateur fromCallable:

private final Observable<Integer> myObservable = Observable.fromCallable(() -> value); 
+0

Merci pour votre réponse. En effet, les Observables dans mon code sont plus complexes que dans l'exemple. Je me demandais simplement s'il était plus performant d'utiliser des champs au lieu de toujours créer les Observables à partir de zéro. – juxeii