Android'de RxJava ne zaman ve Android Architectural Components'tan LiveData ne zaman kullanılır?


186

Android Mimari Bileşenlerden Android ve LiveData RxJava kullanmak için neden almıyorum.Her ikisi arasındaki kullanım ve farklılıklar her ikisi arasındaki farkları açıklayan kod biçiminde örnek örnek ile birlikte açıklanırsa gerçekten yararlı olacaktır.


6
Henüz iyi bir neden buldun mu? Ben de aynı şeyi merak ediyorum ...
IgorGanapolsky

Yanıtlar:


117

Android LiveData, etkin / etkin olmayan geçişlerin eklenmesiyle orijinal gözlemci modelinin bir çeşididir. Bu nedenle, kapsamı çok sınırlayıcıdır.

Android LiveData'da açıklanan örneği kullanarak, konum verilerini izlemek ve uygulama durumuna göre kayıt ve kaydını silmek için bir sınıf oluşturulur.

RxJava çok daha genelleştirilmiş operatörler sağlar. Bu gözlemlenebilir konum bilgilerinin sağlanacağını varsayalım:

Observable<LocationData> locationObservable;

Gözlenebilirlerin uygulanması, Observable.create()geri arama işlemlerini haritalamak için oluşturulabilir. Gözlemlenebilir abone olunca geri arama kaydedilir ve abonelik iptal edildiğinde geri arama kaydı silinir. Uygulama, örnekte verilen koda çok benzemektedir.

Ayrıca, uygulama etkinken doğru yayan bir gözlemlenebiliriniz olduğunu varsayalım:

Observable<Boolean> isActive;

Ardından, LiveData'nın tüm işlevlerini aşağıdakilerle sağlayabilirsiniz:

Observable<LocationData> liveLocation =
  isActive
    .switchMap( active -> active ? locationObservable : Observable.never() );

switchMap()Uygulama etkin değilse kullanıcı ya şu akışı olarak yer, ya da hiçbir sağlayacaktır. Bir kez liveLocationgözlemlenebilir, orada RxJava operatörlerini kullanarak onunla yapabileceğiniz bir çok şey. En sevdiğim örnek:

liveLocation.distinctUntilChanged()
  .filter( location -> isLocationInAreaOfInterest( location ) )
  .subscribe( location -> doSomethingWithNewLocation( location ) );

Bu işlemi yalnızca konum değiştiğinde gerçekleştirir ve konum ilginçtir. Hızı belirlemek için zaman operatörlerini birleştiren benzer işlemler oluşturabilirsiniz. Daha da önemlisi, RxJava operatörlerini kullanarak işlemlerin ana iş parçacığında mı, yoksa arka plan iş parçacığında mı yoksa birden çok iş parçacığında mı gerçekleşeceği konusunda ayrıntılı denetim sağlayabilirsiniz.

RxJava'nın amacı, kütüphaneden sağlanan işlemleri ve hatta sağladığınız özel işlemleri kullanarak kontrol ve zamanlamayı tek bir evrende birleştirmesidir.

LiveData, bu evrenin sadece küçük bir parçasına, yani liveLocation.


2
Teşekkürler, LiveData belgeleri artık bir konum örneğine başvurmuyor gibi görünüyor. Burada daha ilginç noktalar var (bir konum örneği ile): androidkt.com/livedata
Daniel Wilson

5
@DanielWilson bağlantı artık mevcut değil.
Tura

Dostum wtf bu bağlantıda olduğunu hatırlayamıyorum: DI gibi canlı bir veri için Mark Allison'ın örnek kodu: blog.stylingandroid.com/architecture-components-livedata
Daniel Wilson

3
The point of RxJava is that it combines control and timing into a single universe, using operations provided from the library, or even custom operations that you provide. Ancak LiveData yaşam döngüsünün farkında değil. Rx kullanacak olsaydık, yaşam döngüsü değişikliklerini halletmek zorunda kalmaz mıydık?
Sparker0i

@ Sparker0i burada bir noktaya değindi. RxJava yaşam döngüsünün farkında değildir. elle idare etmek zorundayız. LiveData'da olduğu gibi, zaten yaşam döngüsüyle ilgilenilir.
Aks4125

119

Orijinal soru ile ilgili olarak, hem RxJava hem de LiveData birbirini gerçekten iyi tamamlar.

LiveDataAndroid yaşam döngüleri ve ile sıkı entegrasyonu ile ViewModel katmanında parlıyor ViewModel. RxJavadönüşümlerde daha fazla yetenek sağlar (@Bob Dalgleish tarafından belirtildiği gibi).

Şu anda, RxJavaveri kaynağı ve depo katmanlarında LiveDatakullanıyoruz LiveDataReactiveStreamsve ViewModels'de (verileri etkinliklere / parçalara maruz bırakmadan önce) dönüştürülüyor ( bu yaklaşımdan oldukça memnun).


8
Sizi doğru anladıysak, LiveData yalnızca Android kullanıcı arayüzüne özgü uygulamalar için kullanışlıdır. Clean Architecture ile genel bir uygulama oluşturuyor ve bu mimariyi diğer platformlarla paylaşıyorsak, RxJava LiveData'dan daha uygun mu?
IgorGanapolsky

@IgorGanapolsky genel uygulama için hangi dili / çerçeveleri kullanıyorsunuz?
kzotin

Android'den bağımsız API'lar ve Java / Kotlin'de yazılmış Temiz Arch.
IgorGanapolsky

1
cevabınızdaki herhangi bir LiveDataReactiveStreams örneğini önerebilir misiniz?
Pawan

2
Bunu gerek yok @kzotin observeOn, LiveDataReactiveStreamsçağırarak bunu zaten yapar LiveData.postValue(). Ve subscribeOngenel olarak herhangi bir etkinizin olacağının garantisi yoktur .
arekolek

77

LiveData ve RxJava arasında birçok fark vardır:

  1. RxJava'da LiveData bir STREAM değil, her şey (kelimenin tam anlamıyla her şey) bir STREAM .
  2. LiveData gözlemlenebilir bir veri tutucu sınıfıdır. Düzenli bir gözlemlenebilir durumdan farklı olarak, LiveData yaşam döngüsüne duyarlıdır, yani etkinlikler, parçalar veya hizmetler gibi diğer uygulama bileşenlerinin yaşam döngüsüne saygı duyar. Bu farkındalık, LiveData'nın yalnızca etkin bir yaşam döngüsü durumundaki uygulama bileşeni gözlemcilerini güncellemesini sağlar.
  3. LiveData senkronize olduğundan , RxJava ile yaptığınız gibi yalnızca LiveData kullanarak senkronize olmayan bir kod dizisini (şebeke çağrısı, veritabanı yönetimi vb.) Yürütemezsiniz.
  4. Bu ikiliden en iyi şekilde yararlanmak için yapabileceğiniz en iyi şey, iş mantığınız için RxJava'yı kullanmak (şebeke çağrısı, veri işleme vb. Havuz içinde ve ötesinde olan her şey ) ve sunum katmanınız için LiveData kullanmaktır. Böylece, iş mantığınız için dönüşüm ve akış yetenekleri ve kullanıcı arayüzünüz için yaşam döngüsüne duyarlı işlem elde edersiniz.
  5. LiveData ve RxJava birlikte kullanılırlarsa birbirlerini tamamlarlar . Demek istediğim, RxJava ile her şeyi yapın ve sonunda UI'yi güncellemek istediğinizde, Observable'ınızı LiveData'ya değiştirmek için aşağıdaki kod gibi bir şey yapın. Bu nedenle, Görünümünüz (UI) ViewModel'de LiveData'yı gözlemler; burada LiveData'nız değiştirilemez MutableLiveData'dan (veya MutableLiveData değiştirilebilir LiveData'dır).
  6. Öyleyse buradaki soru, neden ilk başta LiveData'yı bile kullanmalısınız? Kodda aşağıda görebileceğiniz gibi, RxJava'dan MutableLiveData'ya (veya LiveData) yanıtınızı kaydedersiniz ve LiveData'nız yaşam döngüsüne duyarlıdır, bu nedenle verileriniz yaşam döngüsüne duyarlıdır. Şimdi, verilerinizin kullanıcı arayüzünü ne zaman ve ne zaman güncellemeyeceğini bildiğini hayal edin.
  7. LiveData'nın bir geçmişi yok (yalnızca geçerli durum). Bu nedenle, bir sohbet uygulaması için LiveData kullanmamalısınız.
  8. LiveData'yı RxJava ile kullandığınızda , MediatorLiveData , SwitchMap vb. Gibi şeylere ihtiyacınız yoktur . Akış kontrol araçlarıdır ve RxJava birçok kez daha iyidir.
  9. LiveData'yı veri sahibi olarak başka bir şey olarak görün. LiveData'nın yaşam döngüsüne duyarlı bir tüketici olduğunu da söyleyebiliriz.

    public class RegistrationViewModel extends ViewModel {
        Disposable disposable;

        private RegistrationRepo registrationRepo;
        private MutableLiveData<RegistrationResponse> modelMutableLiveData =
                new MutableLiveData<>();

        public RegistrationViewModel() {
        }

        public RegistrationViewModel(RegistrationRepo registrationRepo) {
            this.registrationRepo = registrationRepo;
        }

        public void init(RegistrationModel registrationModel) {
            disposable = registrationRepo.loginForUser(registrationModel)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<Response<RegistrationResponse>>() {
                        @Override
                        public void accept(Response<RegistrationResponse>
                                                   registrationModelResponse) throws Exception {

                            modelMutableLiveData.setValue(registrationModelResponse.body());
                        }
                    });
        }

        public LiveData<RegistrationResponse> getModelLiveData() {
            return modelMutableLiveData;
        }

       @Override
       protected void onCleared() {
                super.onCleared();
            disposable.dispose();
         }
    }

5
LiveData'yı veri sahibi olarak başka bir şey olarak görün. ==> EVET
Lou Morda

3
Güzel bir örnek. Tek kullanımlık beyanı unuttun ve onları temizlemek güzel olurdu onCleared.
Snicolas

Canlı verilerin nasıl senkronize olduğunu açıklar mısınız? Bildiğim kadarıyla başka bir iş parçacığına Livedata nesnesi gönderebilir ve daha sonra bu iş parçacığı hangi gözlemcinin MainThread dinleyebilirsiniz sonrası değer.
Hitesh Bisht

Ne yazdığımı tekrar okursanız, başka bir iş parçacığı üzerinde çalışamayacağınız anlamına gelir (EVET, RXJava kullanarak yapabileceğiniz gibi LiveData kullanarak "sadece" bile kullandım)
Abhishek Kumar

Yaşam döngüsü LiveData için büyük bir farklılaştırıcı değil mi? Siz 1. boru hattınızın ne yapması gerektiğini ve sonuçlarınızın neler olduğunu açıklarsınız, 2. "gözlemlemek" maddelerindeki sonuca abone olursunuz, VE sonra 3. boru hattı sadece yaşam döngüsü durumunuz izin veriyorsa çalıştırılır.
Srg

29

Aslında, LiveData bir temelde farklı bir araç değildir RxJavaneden o zaman bir mimarlık bileşeni olarak tanıtıldı, RxJavakolayca yaşam döngüsünü başarmış bir de gözlenebilirlere tüm abonelikler saklayarak CompositeDispoable onları bertaraf sonra nesne ve onDestroy() bir Activity ya onDestroyView() ait Fragment sadece birini kullanarak kod satırı?

Tam RxJava kullanarak ve sonra LiveData kullanarak bir kez film arama uygulaması inşa ederek bu soruya cevap vermiş buraya .

Ama kısacası, evet, olabilir, ancak bunun için temel yaşam döngüsü bilgisine sahip olmanın yanı sıra ilgili yaşam döngüsü yöntemlerini geçersiz kılması gerekir. Bu hala bazıları için anlamlı olmayabilir, ancak gerçek şu ki Google I / O 2018'deki Jetpack oturumlarından birine göre birçok geliştirici yaşam döngüsü yönetimi kompleksi buluyor. Yaşam döngüsü bağımlılığını ele almamadan kaynaklanan çökme hataları, bazı geliştiricilerin, yaşam döngüsü hakkında bilgili olsalar bile, uygulamalarında kullandıkları her Etkinlik / Parçada buna dikkat etmeyi unuttuklarının başka bir işareti olabilir. Büyük uygulamalarda, üretkenlik üzerindeki olumsuz etkisine rağmen, bu bir sorun haline gelebilir.

Sonuç olarak LiveData, daha fazla sayıda geliştiricinin, yaşam döngüsü yönetimini, bellek sızıntısını ve çökmesini anlamak zorunda kalmadan MVVM'yi benimsemesi bekleniyor. Hiç şüphe yok ki LiveData, RxJavayetenekler ve geliştiricilere verdiği güç açısından karşılaştırılabilir olmayan , reaktif programlama ve RxJavabirçokları için anlaşılması zor bir kavram ve araç. Öte yandan, pek çok geliştiricinin yaşadığı tartışmalı yaygın bir konuyu ele almak LiveDataiçin RxJava–bu basitçe yapamaz– yerine çok basit bir araç olduğunu düşünmüyorum .

** GÜNCELLEME ** Ben burada LiveData kötüye nasıl beklenmedik sonuçlara yol açabilir açıkladı yeni bir makale ekledim . RxJava bu durumlarda kurtarmaya gelebilir



2
"RxJava, tüm abonelikleri bir CompositeDispoable'da depolayıp daha sonra bunları Faaliyetin onDestroy () 'sına atayarak yaşam döngüsünü kolayca yönetebildiği zaman tanıtıldı" - aslında LiveDatabertaraf edilecekonStop
arekolek

@arekolek anladığım kadarıyla: CompositeDispoable ile başa çıkmak için bile yaşam döngüsü yöntemlerinin üzerine yazdık. Ancak Canlı verilerde hepsi tek bir kod satırında yer alacaktır. Bu yüzden en az 20 satır kod tasarrufu sağlıyoruz.
Suresh

Bir baseFragment tanımlayabilir ve türetilmiş tüm parçalar tarafından geçersiz kılmak için Disposable [] Subscriptions () yöntemini tanımlayabilir, bu yöntemi onCreateView'da çağırabilir ve bir CompositeDisposable'a dönüş değerini ekleyebiliriz, onDestroyView'de daha fazla unutmadan imha edebiliriz.
android2013

Sadece bertaraf etmekle ilgili değil. RxJava'yı kullanarak, onStop'ta imha etmeniz, ardından onStart / onResume'de tekrar abone olmanız, yapılandırma değişikliklerini işlemeniz ve bir sürü başka şey yapmanız gerekir. Bu yüzden RxJava kullanarak çok fazla çökme var. LiveData bunların hepsini işler ancak RxJava kadar esnek değildir.
1919

24

Eğer reaktif ekosistemde Bildiğiniz gibi biz sahip gözlemlenebilir olduğunu yayar veri ve Gözlemci bu gözlemlenebilir emisyon abone (haberdar olsun) o garip şey sözde Gözlemci Desen şekilde işliyor. Gözlemlenebilir bir şey "bağırır", Gözlemci belli bir anda Gözlenebilir bir şey bağırdığını bildirir.

LiveDataBir activedurumdaki Gözlemcileri yönetmenizi sağlayan bir Gözlemlenebilir olarak düşünün . Diğer bir deyişle LiveData, basit bir Gözlemlenebilir ama aynı zamanda yaşam döngüsüyle de ilgilenir.

Ancak, istediğiniz iki kod örneğini görelim:

A) Canlı Veri

B) RXJava

A) Bu, LiveData'nın temel bir uygulamasıdır

1) yönlendirme değişikliğini korumak için genellikle LiveData'yı ViewModel'de başlatırsınız (salt okunur LiveData'ya veya yazılabilir MutableLiveData'ya sahip olabilirsiniz, bu nedenle genellikle LiveData sınıfından dışarıda kalırsınız)

2) Ana Etkinlik OnCreateyönteminde (ViewModel değil) bir Observer nesnesine (genellikle bir onChanged yöntemi) "abone olursunuz"

3) bağlantı kurmak için gözlemlemek yöntemi başlatmak

İlk olarak ViewModel(iş mantığının sahibi)

class ViewModel : ViewModel() { //Point 1

    var liveData: MutableLiveData<Int> = MutableLiveData()

}

Ve bu MainActivity(mümkün olduğunca aptal)

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val ViewModelProvider= ViewModelProviders.of(this).get(ViewModel::class.java)

        ViewModelProvider.observe(this, Observer {//Points 2 and 3
            //what you want to observe
        })


        }
    }
}

B) Bu RXJava'nın temel uygulamasıdır

1) Gözlemlenebilir beyan edersiniz

2) Bir Gözlemci Beyan Edersiniz

3) Gözlemlenebilir ile Gözlemci'ye abone olursunuz

Observable.just(1, 2, 3, 4, 5, 6) // Point 1

   .subscribe(new Subscriber() {    //Points 2 & 3
       @Override
       public void onCompleted() {
           System.out.println("Complete!");
       }

       @Override
       public void onError(Throwable e) {
       }

       @Override
       public void onNext(Double value) {
           System.out.println("onNext: " + value);
       }
    });

Özellikle LiveDatakullanılır Lifecycleve genellikle ile ViewModelmimarisi bileşenlerine (Görüldüğü gibi). Aslında LiveDatabir ViewModel ile birleştirildiğinde , Gözlemci'deki her değişiklik gerçek zamanlı olarak güncel tutmanıza izin verir , böylece olaylar gereken yerde gerçek zamanlı olarak yönetilir. Kullanım için LiveDataşiddetle kavramını bilmek tavsiye edilir ömrü ve bağıl nesneleri LifeCycleOwner / yaşam döngüsü , ayrıca sana bir göz için öneririm Dönüşümler Uygulamak istiyorsanız, LiveDatagerçek hayat senaryolarında. Burada harika ortak yazılımlardan bazı kullanım durumlarını bulabilirsiniz .

Sarmak için temeldeLiveDatabir basitleştirilmişRXJavaçok daha kolay kod test edebilirsiniz ve çok daha okunabilir hale böylece, bileşenler arasındaki açık sözde bağımlılık kurallarını yaratmadan birden fazla bileşeni üzerinde değişiklik gözlemlemek için, zarif bir şekilde. RXJava, LiveData ve daha fazlasını yapmanıza izin verir. RXJava'nın genişletilmiş işlevleri nedeniyle, LiveData'yı basit durumlar için kullanabilir veya RXJava'nın tüm gücünü ViewModel olarak Android Mimarisi bileşenlerini kullanmaya devamRXJavaedebilirsiniz, elbette buçok daha karmaşık olabileceğianlamına gelir,bunun yerine yüzlerce operatör olduğunu düşünün SwitchMap ve LiveData Haritası (şu anda).

RXJava sürüm 2, Nesne Tabanlı paradigmada devrim yaratan ve programın akışını yönetmek için işlevsel bir yol ekleyen bir kütüphanedir.


4

LiveData, android ekibi tarafından geliştirilen android mimari bileşenlerinin bir alt kümesidir.

Canlı veriler ve diğer mimari bileşenlerle, bellek sızıntıları ve benzeri sorunlar mimari bileşenler tarafından işlenir. Android ekibi tarafından geliştirildiğinden, android için en iyisidir. Ayrıca, Android'in yeni sürümlerini işleyen güncellemeler sağlar.

Yalnızca Android uygulama geliştirmede kullanmak istiyorsanız, Android mimarisi bileşenlerine gidin. Aksi takdirde, web uygulaması, masaüstü uygulamaları vb.Gibi diğer Java uygulamalarını kullanmak istiyorsanız, RxJava'yı kullanın


Cevabınızı netleştirmeye çalıştım. Orijinal niyetinizle herhangi bir şekilde çeliştiysem, düzenlemekten çekinmeyin. Bunu yaparsanız, lütfen ilk revizyondan daha net hale getirmeye çalışın. Cevabınızın son kısmı dürüstçe mantıklı gelmedi.
Zoe

2

LiveDataveri sahibi olarak ve başka bir şey olarak. Ayrıca LiveData'nın Yaşam Döngüsü bilinçli tüketici olduğunu söyleyebiliriz. LiveDatayaşam döngüsü kavramını ve LifeCycleOwner / LifeCycle'ın ilgili nesnelerini bilmeniz önemle tavsiye edilir, iş mantığınız için dönüşüm ve akış yetenekleri ve kullanıcı arayüzünüz için yaşam döngüsü farkında çalışma elde edersiniz.

Rx, problemi zarif bir beyan tarzında çözmeyi sağlayan güçlü bir araçtır. İş tarafı seçeneklerini veya Hizmet Api işlemlerini yönetir


0

LiveData'yı RxJava ile karşılaştırmak, elmaları meyve salatalarıyla karşılaştırıyor.

LiveData'yı ContentObserver ile karşılaştırın ve elmaları elma ile karşılaştırıyorsunuz. LiveData etkin bir şekilde ContentObserver için yaşam döngüsüne duyarlı bir alternatiftir.

RxJava'yı AsyncTask veya başka bir diş açma aracıyla karşılaştırmak, meyve salatalarını portakalla karşılaştırıyor, çünkü RxJava sadece diş açmadan daha fazlasına yardımcı oluyor.


0
  • LiveData kısmen Rx Subject veya SharedRxObservable değerine eşittir

  • LiveData aboneliğin yaşam döngüsünü yönetir, ancak Rx Subject aboneliği manuel olarak oluşturulmalı ve atılmalıdır

  • LiveData sonlandırma durumuna sahip değil ancak Rx Subject OnError ve OnCompleted

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.