2017-04-01 27 views
5

RxJava1'den RxJava2'ye geçiş yapmaya çalışıyorum. Daha önce Observable<Void>'un Compleatable'a sahip olduğu tüm kod parçalarını değiştiriyorum. Ancak akış çağrıları sırasındaki bir problemle karşılaştım. Daha önce Gözlemcilerle uğraşırken ve haritaları ve flatMaps'leri kullanırken, kod 'beklendiği gibi' çalıştı. Ancak, andthen() işlecinin biraz farklı çalışması gibi görünüyor. Sorunun kendisini basitleştirmek için örnek bir kod.RxJava2 diziliş sırası ile karşılaştırılabilir diziliş sırası ile çağrıldı ve Zaman operatörü

1-> Log.d("Starting flow..") 
    2-> Log.d("calling getCompletable"); 
    3-> Log.d("calling getSingle"); 
    4-> Log.d("doing actuall completable work"); 

Ve muhtemelen anlamaya gibi ben satır 4 andthen() operatörünün ismi sonradan hattı 3 (önce çağrılacak beklenir: Sonunda günlüklerine bakın ne

public Single<String> getString() { 
    Log.d("Starting flow..") 
    return getCompletable().andThen(getSingle()); 
} 

public Completable getCompletable() { 
    Log.d("calling getCompletable"); 
    return Completable.create(e -> { 
       Log.d("doing actuall completable work"); 
       e.onComplete(); 
      } 
    ); 
} 

public Single<String> getSingle() { 
    Log.d("calling getSingle"); 
    if(conditionBasedOnActualCompletableWork) { 
     return getSingleA(); 
    }else{ 
     return getSingleB(); 
    } 
} 

olduğunu Kodun 'sonradan' çağrılabilir bir şekilde bitirilip bitirileceğini 'denemenizi tavsiye ederiz. Daha önce Async.toAsync() operatörünü kullanarak Observable<Void>'u yaratıyordum ve şimdi getSingle adı verilen yöntem flatMap akışındaydı - beklediğim gibi çalışıyordu, bu yüzden Log 4'ten önce görünecektim. 3. Şimdi Compleatable'ın oluşturulma şeklini değiştirmeyi denedim - fromAction veya fromCallable kullanmak gibi ama aynı şekilde davranır. Ayrıca andthen()'u değiştirmek için başka bir operatör bulamadım. Altını çizmek için - yöntemin tamamlanabilmesi için tam anlamı olmayan bir yöntem olması gerektiğinden, bu yöntemin uygulanabilir olması gerekir - uygulama tercihlerini ve diğer ayarları değiştirir (ve genel olarak beklendiği gibi genel olarak çalışıyor gibi kullanılır) ve bu değişikliklerin daha sonra yapılması gerekir. akışta. Ayrıca bir tek oluşturmak ve oluşturma bloğu içinde if deyimini taşımak için getSingle() yöntemini sarmaya çalıştım ama orada getSingleA/B() yöntemleri nasıl kullanacağımı bilmiyorum. Ve onların kendi karmaşıklıklarına sahip oldukları için bunları kullanmam gerekiyor ve kodu çoğaltmak mantıklı değil. RxJava2'de bunun nasıl değiştirileceği konusunda herhangi bir fikri olan var mı? Akışla birlikte ilerlemeden önce bitirmek için bir Compleatable işine bel bağladığım birden çok yer var (flatbap kullanarak RxJava1'de sorun yok, oturum açma belirteci, db güncelleştirmeleri, vb. Gibi).

+0

"getCompletable" tarafından döndürülen "Completable" tamamlandıktan sonra "getSingle()" işlevini çağırmanın hemen gerçekleştiğini biliyor musunuz? – akarnokd

cevap

1

erteleyebilir kullanabilirsiniz:

getCompletable().andThen(Single.defer(() -> getSingle())) 

Bu şekilde, hemen getSingle() içeriğini yürütmek yok ama sadece Completable tamamlamalar ve Single için andThen geçiş yapar.

+0

Bahşiş için teşekkür ederim, cevabı faydalı olarak işaretledim - sorunu çözüyor. Söylemem gerekse de, geçici bir çözüm gibi görünüyor. Davranışların neden RxJava1 sürümüne göre değiştiğine hala şaşırdım, burada flatMap'i kullandım ve geri çağırmalar beklediğim sıradaydı. RxJava2 belgelerinin 'yeni olan' bölümünde bu konu hakkında herhangi bir bilgi bulunamadı. –