2015-12-15 56 views
5

Tôi đang sử dụng RxAndroid observable để truy xuất một số đối tượng (Chuỗi trong trường hợp này). dịch vụ của tôi trông như thế này:Sử dụng lập lịch biểu với RxAndroid

public Observable<String> getRandomString() { 
    return Observable.create(new Observable.OnSubscribe<String>() { 
     @Override 
     public void call(Subscriber<? super String> subscriber) { 

      //code to retrieve result 

      subscriber.onNext("this is a string"); 
      subscriber.onCompleted(); 

     } 
    }); 
} 

tôi đăng ký ở người dẫn chương trình của tôi và gửi kết quả sang chế độ xem:

public void loadRandomString() { 

    Observable<String> observable = mService.getRandomString(); 
    observable 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.newThread()) 
      .subscribe(new Subscriber<String>() { 
       @Override 
       public void onCompleted() { } 

       @Override 
       public void onError(Throwable e) { 
        mMainView.onError(e.getLocalizedMessage()); 
       } 

       @Override 
       public void onNext(String string) { 

        //do something with string 
       } 
      }); 
} 

này hoạt động tốt và tất cả, nhưng tôi muốn hoạt động này là theo định kỳ (mỗi x phút). Tôi có thể sử dụng một số Timer hoặc ScheduledThreadPoolExecutor để thực hiện việc này lặp đi lặp lại nhưng tôi muốn xem liệu có một số giải pháp trong lĩnh vực RxAndroid hay không. Tôi đã tìm thấy một số giải pháp cũ từ năm 2013 nhưng rất nhiều mã không được chấp nhận tại thời điểm này. Điều này có thể sử dụng một số loại đệ quy, hoặc tôi có thể đạt được điều này một cách thanh lịch hơn?

Cảm ơn trước!

+0

là 'getRandomString' giống với' getString'? – Blackbelt

+0

Có! Tôi đã thay đổi một số tên vì mục đích đơn giản. –

Trả lời

6

Điều bạn có thể muốn là Observable.interval(). Nó phát ra trên một khoảng thời gian. Sau đó bạn có thể flatMap đó vào Observable<String> của bạn, như vậy:

Observable.interval(3, TimeUnit.MINUTES) 
    .flatMap(new Func1<Long, Observable<String>>() { 
     @Override 
     public Observable<String> call(Long ignore) { 
     return getRandomString(); 
     } 
    }) 
    .subscribe(...insert your subscriber here...); 

Điều đó nói rằng - nếu bạn đang đi để được làm điều này mỗi vài phút, bạn có thể được tốt hơn off nhìn vào AlarmManager hoặc JobScheduler, vì rất có thể là người dùng sẽ không tập trung vào ứng dụng của bạn trong một khoảng thời gian dài.


Là một sang một bên, nó muốn được dễ dàng hơn để sử dụng Observable.just("this is a string") hơn Observable.create().

+0

Cảm ơn câu trả lời của bạn, điều này dường như hoạt động tốt! Tôi đã thay đổi nó thành 'Observable.interval (0, 3, TimeUnit.MINUTES)' bởi vì tôi không muốn sự chậm trễ lúc đầu. Cảm ơn lời khuyên của bạn về 'AlarmManager' nhưng đây không phải là ứng dụng thông thường của bạn, trường hợp sử dụng là ứng dụng sẽ ở nền trước trong nhiều ngày. Tuy nhiên tôi nhầm lẫn về phần 'Observable.just()', trong bài viết gốc của tôi, tôi đã xóa tất cả các mã có liên quan và chỉ chèn một chuỗi mô phỏng vào 'onNext()', chắc chắn với logic ban đầu 'Observable.just()' sẽ không đủ? –

+0

@NielsMasdorp Trong những trường hợp này, tôi sử dụng 'defer (() -> Observable.just())'. Bằng cách đó bạn có thể thực thi mã trước khi mục được phát ra. Vấn đề với việc sử dụng 'create()' là bạn (về mặt lý thuyết) phải xử lý các yêu cầu và backpressure và đó là một nỗi đau thực sự. –

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