2015-08-24 30 views
5

Tôi đang gặp khó khăn trong việc hiểu RX. Trong trường hợp sau, bạn có cần hủy đăng ký không? Có cách nào để tự động hủy đăng ký sau khi chức năng "gọi" được thực thi không?Có cần thiết phải hủy đăng ký

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(); 

Tôi không muốn để quan sát đối với bất kỳ kết quả đó là lý do tại sao tôi bỏ qua cổ điển .observeOn(AndroidSchedulers.mainThread())

Thx cho lời giải thích.

+0

'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ì? –

+0

@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

+1

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()' –

Trả lời

5

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); 
      } 
     }); 
4

Khi có thể quan sát được hoàn tất, RxJava hủy đăng ký tự động. Bạn cần gọi số subscriber.onComplete() để thực hiện đăng ký tự động.

Các vấn đề liên quan