Когда использовать RxJava в Android и когда использовать LiveData из архитектурных компонентов Android?


Я не получаю причину использовать RxJava в Android и LiveData от Android Architectural Components.It было бы очень полезно, если бы usecases и различия между ними объяснялись вместе с примером примера в виде кода, который объясняет различия между ними.

5 67

5 ответов:

Android LiveData-это вариант исходного шаблона наблюдателя с добавлением активных/неактивных переходов. Как таковая, она весьма ограничительна по своему охвату.

используя пример, описанный в Android LiveData, класс создается для мониторинга данных о местоположении, а также регистрации и отмены регистрации на основе состояния приложения.

RxJava предоставляет операторы, которые являются гораздо более обобщенными. Предположим, что это наблюдаемое обеспечит местоположение данные:

Observable<LocationData> locationObservable;

реализация наблюдаемого может быть построена с помощью Observable.create() для сопоставления операций обратного вызова. Когда объект observable подписан, обратный вызов регистрируется, а когда он отписан, обратный вызов не регистрируется. Реализация выглядит очень похоже на код, приведенный в Примере.

давайте также предположим, что у вас есть наблюдаемый, который выдает true, когда приложение активно:

Observable<Boolean> isActive;

затем вы можете предоставить все функциональные возможности LiveData следующие

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

The switchMap() оператор либо предоставит текущее местоположение в виде потока, либо ничего, если приложение не активно. Как только у вас есть liveLocation наблюдаемый, есть много вещей, которые вы можете сделать с ним, используя операторы RxJava. Мой любимый пример:

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

это будет выполнять только действие, когда местоположение изменилось, и местоположение интересно. Вы можете создать аналогичные операции, которые совместить время операторы для определения скорости. Что еще более важно, вы можете обеспечить детальный контроль того, происходят ли операции в основном потоке, фоновом потоке или нескольких потоках, используя операторы RxJava.

смысл RxJava заключается в том, что он объединяет управление и синхронизацию в единую вселенную, используя операции, предоставляемые из библиотеки, или даже пользовательские операции, которые вы предоставляете.

LiveData обращается только к одной небольшой части этой вселенной, эквивалент построения liveLocation.

что касается первоначального вопроса, то и RxJava, и LiveData очень хорошо дополняют друг друга.

LiveData сияет на уровне ViewModel, с его тесной интеграцией с жизненными циклами Android и ViewModel. RxJava предоставляет больше возможностей в преобразованиях (как упоминалось @Bob Dalgleish).

в настоящее время, мы используем RxJava в слоях источника данных и репозитория, и он преобразуется в LiveData (через LiveDataReactiveStreams) в ViewModels (перед предоставлением данных activities / fragments) - вполне доволен таким подходом.

в самом деле LiveData не принципиально другой инструмент RxJava, Так почему же он был введен в качестве компонента архитектуры, когда RxJava можно было бы легко управлять жизненным циклом, сохраняя все подписки на наблюдаемые объекты в CompositeDispoable объект, а затем размещать их в onDestroy() на Activity или onDestroyView() на Fragment используя только одну строку кода?

я ответил на этот вопрос полностью, создав приложение для поиска фильмов один раз с помощью RxJava, а затем с помощью LiveData здесь.

но вкратце, да, это может быть, но для этого потребуется сначала переопределить соответствующие методы жизненного цикла, помимо наличия базовых знаний жизненного цикла. Это все еще может не иметь смысла для некоторых, но дело в том, что согласно одному из сеансы Jetpack в Google I / O 2018 многие разработчики считают управление жизненным циклом сложным. Ошибки сбоя, возникающие из-за НЕ обработки зависимости жизненного цикла, могут быть еще одним признаком того, что некоторые разработчики, даже если вы знаете о жизненном цикле, забудьте позаботиться об этом в каждом действии / фрагменте, который они используют в своем приложении. В больших приложениях это может стать проблемой, несмотря на негативное влияние, которое это может иметь на производительность.

суть в том, что путем введения LiveData, ожидается, что большее число разработчиков примет MVVM даже без необходимости понимать управление жизненным циклом, утечку памяти и сбой. Хотя я в этом не сомневаюсь LiveData не сопоставимо с RxJava С точки зрения возможностей и мощности, которую он дает разработчикам, реактивного программирования и RxJava - это трудно понять концепцию и инструмент для многих. С другой стороны, я не думаю LiveData предназначен для замены RxJava - это просто не может–но очень простой инструмент для обработки спорной широко распространенной проблемы, с которой сталкиваются многие разработчики.

как вы знаете, в реактивной экосистеме у нас есть наблюдаемых который выдает данные и Обозреватель который подписывается (получает уведомление) об этом наблюдаемом излучении, ничего странного в том, как работает так называемый шаблон наблюдателя. Наблюдаемый "кричит" что-то, наблюдатель получает уведомление, что наблюдаемый кричит что-то в данный момент.

думаю LiveData как наблюдаемый, что позволяет управлять наблюдателями, которые находятся в active государство. Другими словами LiveData - это просто наблюдаемая , но и заботится о жизненном цикле.

но давайте посмотрим на два случая кода, которые вы запрашиваете:

A) Живые Данные

B) RXJava

A)это базовая реализация LiveData

1) вы обычно создаете экземпляр LiveData в ViewModel для поддержания изменения ориентации (Вы можете иметь LiveData, который доступен только для чтения, или MutableLiveData, который доступен для записи, поэтому вы обычно выставляете наружу из класса LiveData)

2) в OnCreate метод Главная активность (не ViewModel) мы вы "подписываетесь" на объект наблюдателя (обычно метод onChanged)

3) вы запускаете метод наблюдать, чтобы установить ссылку

сначала ViewModel (владеет бизнес-логики)

class ViewModel : ViewModel() { //Point 1

var liveData: MutableLiveData<Int> = MutableLiveData()

}

и это MainActivity (как можно тупее) класс 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
        })


        }
    }
  }

Б)это основная реализация RXJava

1) Вы объявляете заметную

2) вы объявляете наблюдателя

3) Вы подписываетесь на наблюдаемое с наблюдателем

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

в частности LiveData используется Lifecycle и часто с ViewModel(как мы уже видели) компоненты архитектуры. На самом деле, когда LiveData в сочетании с ViewModel позволяет для обновления в режиме реального времени каждое изменение в наблюдателе, так что события в режиме реального времени, где требуется. Использовать LiveData настоятельно рекомендуется знать понятие жизненный цикл и относительные объекты LifeCycleOwner / LifeCycle, также я бы предложил вам взглянуть на преобразования, если вы хотите реализовать LiveData в реальных жизненных сценариях. Здесь вы можете найти некоторые случаи использования от великого commonswear.

закончить в принципе LiveData - это упрощенная RXJava, элегантный способ наблюдать изменения между несколькими компонентами без создания явных так называемых правил зависимостей между компонентами, так что вы можете проверить гораздо проще код и сделать его гораздо более читаемым. RXJava, позволяет вам делать вещи LiveData и многое другое. Из-за расширенных функциональных возможностей RXJava вы можете использовать LiveData для простых случаев или использовать всю мощь RXJava продолжать использовать компоненты архитектуры Android в качестве ViewModel конечно, это означает, что RXJava может быть гораздо сложнее, просто подумайте, имеет сотни операторов вместо SwitchMap и Map LiveData(на данный момент).

RXJava version 2-это библиотека, которая революционизировала объектно-ориентированную парадигму, добавив так называемый функциональный способ управления потоком программы.

LiveData-это подмножество компонентов архитектуры android, которое разработано командой android.С живыми данными и другими компонентами архитектуры (лучше всего подходит для android.Утечки памяти и т. д. обрабатываются компонентами архитектуры.Так как он разработан android team.So он лучше всего подходит для android,они предоставляют обновления с repect для новых версий android и т. д.) Мы можем сделать то, что мы можем достичь в RxJava.
Если вы хотите использовать в Android только в стиле андроид компоненты и если вы хотите использовать модуль ur в android и других средствах (Java-приложение и т. д.), перейдите в RxJava (react native)