2015-04-17 26 views
14

RxJava'ya oldukça yeniyim, bu muhtemelen aptalca bir soru. Senaryonumu tarif edeceğim.RxJava tekli arka plan iş parçacığı zamanlayıcısı

Bazı resimleri güncelleştiren UI iş parçacığı üzerinde bazı kodlar var ama bu görüntüler çok önemli değil ve üretirken biraz kaynak tüketiyorlar, böylece bunları tek bir iş parçacığı üzerinde oluşturmak istiyorum (kullanıcı arabirimi değil) Tabii ki) ve bunları tek tek üretin. Ben trambolin zamanlayıcı istediğimi tahmin ediyorum ama benim sorunum, eğer kullanırsam o zaman UI iş parçacığı üzerinde çalışma yapar ve bunu başka bir iş parçacığında yapmak istiyorum.

Açıkçası, öğeleri sıraya koyabildiğim kendi iş parçamı yazabilirim ve sonra bunları tek tek işler, ancak belki de RxJava'nın benim için basit bir çözümü olacağını düşündüm.

Benim geçerli kod şöyle görünür: "? Ui iş parçacığı üzerinde"

Observable<Bitmap> getImage = Observable.create(new Observable.OnSubscribe<Bitmap>() { 
    @Override public void call(Subscriber<? super Bitmap> subscriber) { 
     Log.w(TAG,"On ui thread? "+ UIUtils.isRunningOnUIThread()); 
     subscriber.onNext(doComplexTaskToGetImage()); 
     subscriber.onCompleted(); 
    } 
}); 

getImage.subscribeOn(Schedulers.trampoline()).subscribe(new Action1<Bitmap>() { 
    @Override public void call(Bitmap bitmap) { 
     codeToSetTheBitmap(bitmap); 
    } 
}); 
diyor

My günlüğü her zaman doğrudur. Öyleyse, bu kodu ve aynı işi tek bir iş parçacığında (ui iş parçacığı değil) çalıştırarak, bu iş için sıraya bir kod kodu yazmadan sırayla nasıl yapabilirim?

Düzenleme:

Ben bu şimdi Schedulers.single() kullanılarak gerçekleştirilebilir veya kendi isterseniz new SingleScheduler() kullanabilirsiniz inanıyoruz

. Hala test ediyorum ama bunu yayınladığımda geri istediğimi düşünüyorum.

aşağıdaki yollardan biriyle Observable için Scheduler oluşturmak için tek yeniden kullanılabilir iplik oluşturabilir
+0

http://reactivex.io/documentation/operators/subscribeon.html https://github.com/ReactiveX/RxAndroid – corsair992

+0

Zaten RxAndroid kullanıyorum ve kodum "subscribeOn" kullanıyorum gösterir. Ne istediğimi yapmak için 'subscribeOn''a ne geçeceğini bilmiyorum. – casolorz

+1

Arka plan iş parçacığına 'Zamanlayıcı' (['Zamanlayıcılar sınıfı] (http://reactivex.io/RxJava/javadoc/rx/schedulers/Schedulers.html) oluşturmak için statik fabrika yöntemleri içerir. O zaman, 'AndroidSchedulers.mainThread()' yöntemi ile RxAndroid'te edinilebilecek bir ana iş parçacığı 'Zamanlayıcı 'üzerinde gözlemlemeniz gerekir. – corsair992

cevap

12

:

  • 1 (Executors.newSingleThreadExecutor() bir havuz boyutuna sahip bir ThreadPoolExecuter oluşturma yapmak için uygun bir statik fabrika yöntemidir Bu), daha sonra Schedulers.from() yöntemini kullanarak zamanlayıcıları oluşturmak için kullanın.
  • RxAndroid eylemleri planlamak için bir Handler kullanan özel Scheduler uygulanmasını sağlar ve böylece AndroidSchedulers.handlerThread() fabrika yöntemine Handler var geçirerek bir Looper yayınlanmıyor herhangi Thread ile kullanılabilir.

Bu görevlerin sonunda UI ile etkileşim kuruyorsanız, ana iş parçacığına Scheduler göz atmanız gerekeceğini unutmayın.

+6

rxjava'da 'newThread()' gibi bir 'Schedulers.singleThread()' yöntemini özlüyorum. –

+1

@AlvaroGutierrezPerez RxJava 2'nin yeni bir 'Schedulers.single()' vardır. –

7

RxJava 2'de kullanabileceğiniz Schedulers.single():

aynı arka plan parçacığı üzerinde kuvvetle sıralı yürütme gerektiren iş için varsayılan bir ortak, tek iplik destekli Zamanlayıcı örneğini döndürür.

Daha fazla ayrıntı için lütfen see the documentation'a başvurun.

RxJava 1 Schedulers documentation'da göremiyorum.

İlgili konular