2015-12-15 15 views
5

ile zamanlamayı kullanma Bazı nesneleri almak için bir RxAndroid observable kullanıyorum (bu durumda String). Benim hizmet şuna benzer: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(); 

     } 
    }); 
} 

benim sunum abone ve görünüme sonucu yazı:

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

Bu ince ve tüm çalışır, ancak bu işlem periyodik olmak istiyorum (her x dakika). Bunu tekrar tekrar yapmak için Timer veya ScheduledThreadPoolExecutor kullanabilirdim, ancak RxAndroid alanında bir çözüm olup olmadığını görmek isterim. 2013'ten bazı eski çözümler buldum, ancak bu sırada birçok kod kullanımdan kaldırıldı. Bu bir tür tekrarlama kullanarak mümkün mü yoksa bunu daha zarif bir şekilde yapabilir miyim?

Şimdiden teşekkürler!

+0

'getRandomString'' getString' ile aynı mıdır? – Blackbelt

+0

Evet! Basitlik uğruna bazı isimler değiştirdim. –

cevap

6

Muhtemelen istediğiniz Observable.interval(). Zamanlanmış bir aralıkta yayılır. Daha sonra bu yüzden gibi, Observable<String> içine flatmap edebilirsiniz: bahsedilen

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

- Bunu her birkaç dakikada yapıyor olacağız, sen AlarmManager veya JobScheduler içine bakarak daha iyi olabilir, büyük ihtimalle kullanıcıları beri uzun bir süre için uygulamanıza odaklanmayacak.

bir kenara olarak

, Observable.create() daha Observable.just("this is a string") kullanmak çok daha kolay olurdu.

+0

Cevabınız için teşekkürler, bu iyi çalışıyor gibi görünüyor! Onu '' Observable.interval '' (0, 3, TimeUnit.MINUTES) olarak değiştirdim çünkü başlangıçta gecikmeyi istemiyorum. 'AlarmManager' ile ilgili ipucunuz için teşekkürler, ancak bu her zamanki uygulamanız değildir, kullanım durumu, uygulamanın günler için ön planda olmasıdır. Ancak ben 'Observable.just()' kısmı hakkında kafam karıştı, orijinal yazımda tüm ilgili kodları kaldırdım ve sadece orijinal mantık 'Observable.just()' ile kesinlikle 'onNext()' a alaycı bir dize ekledim yeterli olmaz mı –

+0

@NielsMasdorp Bu durumlarda 'defer (() -> Observable.just())' kullanın. Bu şekilde, öğe yayınlanmadan önce kodu çalıştırabilirsiniz. 'Create()' işlevini kullanma konusundaki sorun, sizden (teorik olarak) istekleri ve geri tepmeyi ele almanız gerektiğidir ve bu gerçek bir acıdır. –