2015-08-24 1 views
5

J'ai du mal à comprendre RX. Dans le cas suivant, est-il nécessaire de se désinscrire? Est-il possible de se désabonner automatiquement après l'exécution de la fonction "call"?Est-il nécessaire de se désabonner

Observable.create(new Observable.OnSubscribe<NumberInfo>() { 
     @Override 
     public void call(Subscriber<? super NumberInfo> subscriber) { 
      try { 
       // Store data to db 
      } catch (Exception e) { 
       Log.e(TAG, "Downloaded numberInfo was not added to cache.", e); 
      } 
     } 
    }).subscribeOn(Schedulers.newThread()) 
    .subscribe(); 

Je ne veux pas d'observer pour un résultat qui est la raison pour laquelle je l'.observeOn(AndroidSchedulers.mainThread()) classique omis

Thx pour l'explication.

+0

'Je ne veux pas d'observer pour tout result' - vous n'avez pas besoin «Observable» en premier lieu. Quel problème vous essayez de résoudre exactement? –

+0

@Dmitry Zaitsev J'en ai besoin pour remplacer asyncTask. La deuxième option pourrait être d'exécuter l'extrait dans un thread mais l'observable peut le gérer aussi. – zatziky

+1

J'envisagerais d'utiliser des extensions Async pour RxJava - ils ont déjà tous ces éléments implémentés, donc vous pouvez simplement appeler 'start (yourTask) .subscribe()' –

Répondre

5

Selon le contrat Rx, lorsque le Observable déclenche onCompleted, le Observer se désinscrit. Dans votre cas, le contrat n'est pas respecté car il n'y a pas subscriber.onCompleted() dans votre code.

Si vous avez juste besoin de quelque chose comme « feu et oublier », vous pouvez juste essayer:

Schedulers.io().createWorker().schedule(new Action0() { 
    @Override 
    public void call() { 
     try { 
      // Store data to db 
     } catch (Exception e) { 
      Log.e(TAG, "Downloaded numberInfo was not added to cache.", e); 
     } 
    } 
}); 

Il exécuterons E/S Scheduler et votre thread d'interface utilisateur est sûr.

IMO vous devriez toujours avoir une valeur de retour. Votre routage Store data to db a certainement une valeur de retour, comme un long spécifiant le numéro de ligne ou un boolean qui indique succès. Avoir cette approche, vous pouvez créer une méthode appropriée:

public Observable<Long> storeToDb(final SomethingToStore storeMe) { 
    return Observable 
      .create(new Observable.OnSubscribe<Long>() { 
       @Override 
       public void call(Subscriber<? super Long> subscriber) { 
        long row = syncStore(storeMe); 

        if (row == -1) { 
         subscriber.onError(new Throwable("Cannot store " + storeMe.toString + " to DB.")); 
        } 

        subscriber.onNext(row); 
        subscriber.onCompleted(); 
       } 
      }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); 
} 

Et vous pouvez l'utiliser comme ceci:

storeToDb(storeThis) 
     .subscribe(new Observer<Long>() { 
      @Override 
      public void onCompleted() { 

      } 

      @Override 
      public void onError(Throwable e) { 
       Log.e("STORING", "Something went south: " + e.getMessage()); 
      } 

      @Override 
      public void onNext(Long row) { 
       Log.d("STORING", "Everything has been stored as record number: " + row); 
      } 
     }); 
4

Lorsque Observable est terminé, RxJava se désabonne automatiquement. Vous devez appeler subscriber.onComplete() pour effectuer une désinscription automatique.