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);
}
});
'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? –
@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
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()' –