Theo hợp đồng Rx, khi Observable
kích hoạt onCompleted
, số Observer
hủy đăng ký. Trong trường hợp của bạn, hợp đồng không được tôn trọng vì không có mã số subscriber.onCompleted()
trong mã của bạn.
Nếu bạn chỉ cần một cái gì đó như "Fire và quên", bạn có thể thử chỉ:
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);
}
}
});
Nó sẽ thực thi trên I/O Scheduler và thread UI bạn được an toàn.
IMO bạn luôn phải có giá trị trả lại. Định tuyến Store data to db
của bạn chắc chắn có một số giá trị trả lại, như số long
chỉ định số hàng hoặc boolean
cho biết thành công. Có phương pháp này, bạn có thể tạo ra một phương pháp thích hợp:
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());
}
Và bạn có thể sử dụng nó như thế này:
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);
}
});
Nguồn
2015-08-25 12:51:03
'Tôi không muốn để quan sát đối với bất kỳ result' - sau đó bạn không cần 'Quan sát' ngay từ đầu. Bạn đang cố giải quyết vấn đề gì? –
@Dmitry Zaitsev Tôi cần nó để thay thế asyncTask. Tùy chọn thứ hai có thể là chạy đoạn mã trong một luồng nhưng có thể quan sát được nó. – zatziky
Tôi sẽ xem xét sử dụng các phần mở rộng Async cho RxJava - chúng có tất cả các công cụ này đã được triển khai, vì vậy bạn có thể chỉ cần gọi 'start (yourTask) .subscribe()' –