何时在Android中使用RxJava以及何时使用Android Architectural Components中的LiveData?

时间:2017-09-20 03:44:10

标签: android rx-java2 rx-android reactive android-architecture-components

我没有理由在Android中使用RxJava和从Android Architectural Components中使用LiveData。如果两者之间的用例和差异与代码形式的示例示例一起解释,这将解释之间的差异,这将非常有用。两者。

9 个答案:

答案 0 :(得分:88)

Android LiveData是原始观察者模式的变体,添加了活动/非活动过渡。因此,它的范围非常严格。

使用Android LiveData中描述的示例,创建一个类来监视位置数据,并根据应用程序状态注册和取消注册。

RxJava提供了更加通用化的运算符。我们假设这个observable将提供位置数据:

Observable<LocationData> locationObservable;

可以使用Observable.create()构建observable的实现来映射回调操作。订阅observable时,将注册回叫,并且当取消订阅时,将取消注册回叫。该实现看起来与示例中提供的代码非常相似。

我们还假设您有一个在应用程序处于活动状态时发出true的observable:

Observable<Boolean> isActive;

然后,您可以通过以下

提供LiveData的所有功能
Observable<LocationData> liveLocation =
  isActive
    .switchMap( active -> active ? locationObservable : Observable.never() );

switchMap()运算符将提供当前位置作为流,如果应用程序未处于活动状态,则不提供任何内容。一旦你有了liveLocation可观察对象,就可以使用RxJava运算符做很多事情。我最喜欢的例子是:

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

这只会在位置发生变化时执行操作,并且位置很有趣。您可以创建类似的操作 结合时间运算符来确定速度。更重要的是,您可以使用RxJava运算符提供对主线程,后台线程或多线程中是否发生操作的详细控制。

RxJava的意思在于它将控制和计时结合到单个Universe中,使用库提供的操作,甚至是您提供的自定义操作。

LiveData仅处理该Universe的一小部分,相当于构建liveLocation

答案 1 :(得分:74)

关于原始问题,RxJava和LiveData都很好地相互补充。

LiveData在ViewModel图层上闪耀,与Android生命周期和ViewModel紧密集成。 RxJava提供了更多的转换功能(如@Bob Dalgleish所述)。

目前,我们在数据源和存储库层中使用RxJava,并在ViewModels中将其转换为LiveData(使用LiveDataReactiveStreams)(在公开数据之前)活动/片段) - 对这种方法非常满意。

答案 2 :(得分:23)

实际上,LiveDataRxJava并不是一个本质上不同的工具,所以当RxJava通过存储所有订阅可以轻松管理生命周期时,为什么它作为架构组件引入?对CompositeDispoable个对象中的可观察对象,然后只使用一行代码将其onDestroy() Activity onDestroyView() Fragment中的LiveData处理?

我已经通过使用RxJava构建电影搜索应用程序并使用LiveData here完全回答了这个问题。

但简而言之,是的,它可以,但除了拥有基本的生命周期知识外,还需要首先覆盖相关的生命周期方法。对于某些人来说,这仍然可能没有意义,但事实是,根据Jetpack sessions in Google I/O 2018之一的许多开发人员发现生命周期管理很复杂。不处理生命周期依赖性引起的崩溃错误可能是另一个迹象,即一些开发人员,即使知道生命周期,也忘记在他们的应用程序中使用的每个Activity / Fragment中处理它。在大型应用程序中,这可能成为一个问题,尽管它可能对生产力产生负面影响。

最重要的是,通过引入LiveData,预计会有更多的开发人员采用MVVM,甚至无需了解生命周期管理,内存泄漏和崩溃。即使我毫不怀疑RxJava在功能和开发人员能力方面与RxJava不具有可比性,但反应式编程和LiveData是一个难以理解的概念,很多工具。另一方面,我不认为RxJavaRTCMediaConstraints的替代品 - 它根本不能 - 但是一个非常简单的工具来处理许多开发人员经历的有争议的广泛问题。

**更新** 我添加了一篇新文章here,其中我解释了如何滥用LiveData会导致意外结果。 RxJava可以在这些情况下来救援

答案 3 :(得分:21)

正如您在反应式生态系统中所知,我们有一个发出数据的 Observable 和一个 Observer 订阅(获得通知)此Observable发射,没有什么奇怪的工作所谓的观察者模式。一个Observable&#34;喊叫&#34;某事,Observer得到通知Observable在特定时刻喊出什么。

LiveData视为Observable,允许您管理处于active状态的观察者。换句话说,LiveData是一个简单的Observable ,但负责生命周期。

但是,让我们看看你要求的两个代码案例:

A)实时数据

B)RXJava

A)这是LiveData的基本实现

1)您通常在ViewModel中实例化LiveData以维持方向更改(您可以将LiveData设置为只读,或者MutableLiveData是可写的,因此您通常会在LiveData类外部公开)

2)在 Main 活动的OnCreate方法中(不是ViewModel) 你&#34;订阅&#34;一个Observer对象(通常是一个onChanged方法)

3)你启动方法观察建立链接

首先是ViewModel(拥有业务逻辑)

class ViewModel : ViewModel() { //Point 1

    var liveData: MutableLiveData<Int> = MutableLiveData()

}

这是MainActivity(尽可能愚蠢)

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)这是RXJava的基本实现

1)你宣布一个Observable

2)你宣布一个观察者

3)您使用Observer订阅Observable

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

特别是LiveDataLifecycle一起使用,并且通常与ViewModel(我们已经看到)架构组件一起使用。事实上,当LiveData与ViewModel结合使用时,可以实时更新Observer中的每次更改,以便在需要的地方实时管理事件。强烈建议您使用LiveData了解lifecycle和相对对象LifeCycleOwner/LifeCycle的概念,如果您愿意,我建议您查看Transformations在现实生活场景中实施LiveData。在这里,你可以找到伟大的commonsware中的一些用例。

总结 基本上LiveData是一种简化的RXJava,这是一种优雅的方式来观察多个组件的变化,而不会创建明确的所谓依赖组件之间的规则,以便您可以更轻松地测试代码并使其更具可读性。 RXJava,允许你做LiveData的事情等等。由于RXJava的扩展功能,您既可以将LiveData用于简单案例,也可以利用RXJava的所有功能继续使用Android架构组件作为ViewModel,当然这意味着RXJava可以更多复杂,只需要思考有数百个运营商而不是SwitchMap和LiveData Map(目前)。

RXJava版本2是一个彻底改变面向对象范式的库,它添加了一种所谓的功能方式来管理程序流程。

答案 4 :(得分:13)

LiveData和RxJava之间有很多区别

  1. LiveData不是 STREAM ,而在Rxjava中,所有内容(实际上是所有内容)都是 STREAM
  2. LiveData是同步,因此您不能像使用Rxjava一样仅使用LiveData来异步执行一大堆代码(网络调用,数据库操作等)。
  3. 要充分利用此二重奏,您最好的办法是将Rxjava用于您的业务逻辑(网络调用,数据处理等,存储库之内和之外发生的一切),并使用LiveData进行。您的表示层。这样,您就可以获得业务逻辑和UI的生命周期感知操作的转换和流功能。
  4. LiveData和Rxjava互相补充(如果一起使用)。我的意思是,使用RxJava进行所有操作,最后,当您要更新UI时,执行类似下面的代码将Observable更改为Livedata。因此,您的View(UI)会在ViewModel中观察Livedata,其中的LiveData就是非可变MutableLiveData(或者MutableLiveData是可变LiveData)。
  5. 所以这里的问题是,为什么您首先还要使用LiveData? 如下面的代码所示,您将Rxjava的响应存储到MutableLiveData(或LiveData),并且LiveData是生命周期感知的,因此在某种程度上,您的数据是生命周期感知的。现在,想象一下当数据本身知道何时以及何时不更新UI时的可能性。

  6. LiveData没有历史记录(仅是当前状态)。因此,您不应将LiveData用于聊天应用程序。

  7. 将LiveData与RxJava一起使用时,不需要诸如 MediatorLiveData SwitchMap 等之类的东西。它们是流控制工具,而RxJava在这方面要好很多。
  8. 将LiveData视为数据持有者,别无其他。我们也可以说LiveData是了解生命周期的消费者。

     public class RegistrationViewModel extends ViewModel {
    
        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;
             }
    }
    

答案 5 :(得分:3)

LiveData是android团队开发的android体系结构组件的子集。

对于实时数据和其他体系结构组件,内存泄漏和其他类似问题由体系结构组件处理。由于它是由android团队开发的,因此最适合android。他们还提供处理新版本Android的更新。

如果您只想在Android应用程序开发中使用,请使用Android体系结构组件。否则,如果您想使用其他Java应用程序(例如Web应用程序,桌面应用程序等),请使用RxJava

答案 6 :(得分:1)

  • LiveData部分等于Rx主题或SharedRxObservable

  • LiveData管理订阅的生命周期,但Rx主题 订阅应手动创建并处理

  • LiveData没有终止状态,但Rx主题具有OnError 和OnCompleted

答案 7 :(得分:0)

LiveData作为数据持有者,别无其他。我们也可以说LiveData是生命周期感知的消费者。强烈建议LiveData了解生命周期的概念以及相关的对象LifeCycleOwner / LifeCycle,以便为您的业务逻辑和UI的生命周期感知操作提供转换和流功能。

Rx是功能强大的工具,可以用优雅的声明式样式解决问题。它处理业务方面的选择或服务Api操作

答案 8 :(得分:0)

将LiveData与RxJava进行比较,正在将苹果与水果沙拉进行比较。

将LiveData与ContentObserver进行比较,您正在将苹果与苹果进行比较。 LiveData有效地替代了ContentObserver的生命周期。

将RxJava与AsyncTask或其他任何线程处理工具进行比较,正在将水果沙拉与橙子进行比较,因为RxJava不仅可以帮助线程化。