2015-12-15 4 views
5

Я использую RxAndroid observable для извлечения некоторого объекта (строка в этом случае). Моя служба выглядит следующим образом:Использовать планирование с помощью 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(); 

     } 
    }); 
} 

подписаться на мой ведущий и отправить результат в представлении:

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

Это прекрасно работает и все, но я хочу, эта операция будет периодически (каждые х минуты). Я мог бы использовать Timer или ScheduledThreadPoolExecutor, чтобы делать это снова и снова, но я хотел бы посмотреть, есть ли какое-то решение в области RxAndroid. Я нашел несколько старых решений с 2013 года, но многие из них устарели в настоящее время. Возможно ли это, используя какую-то рекурсию, или я могу достичь этого более элегантным способом?

Заранее благодарен!

+0

является 'getRandomString' так же, как' getString'? – Blackbelt

+0

Да! Я просто изменил некоторые имена для простоты. –

ответ

6

Возможно, вы захотите, чтобы это было Observable.interval(). Он испускает временной интервал. Вы можете flatmap, что в вашем Observable<String>, например, так:

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

Это говорит - если вы собираетесь делать это каждые несколько минут, вы могли бы быть лучше смотреть в AlarmManager или JobScheduler, так как шансы пользователей не будет сосредоточено на вашем приложении в течение длительного периода времени.


Как и в сторону, было бы гораздо проще в использовании, чем Observable.just("this is a string")Observable.create().

+0

Спасибо за ваш ответ, кажется, все нормально! Я изменил его на 'Observable.interval (0, 3, TimeUnit.MINUTES)', потому что я не хочу задержки в начале. Спасибо за ваш отзыв о 'AlarmManager', но это не ваше обычное приложение. Вариант использования заключается в том, что приложение будет находиться на переднем плане в течение нескольких дней. Однако я смущен частью 'Observable.just()', в моем исходном сообщении я удалил весь соответствующий код и только что вставил mock-строку в 'onNext()', безусловно, с исходной логикой 'Observable.just()' не хватит? –

+0

@NielsMasdorp В таких случаях я использую 'defer (() -> Observable.just())'. Таким образом, вы можете выполнить код перед выпуском элемента. Проблема с использованием 'create()' заключается в том, что вам (теоретически) приходится обрабатывать запросы и противодавление, и это настоящая боль. –

Смежные вопросы