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

rah*_*l66 158 android rx-android reactive rx-java2 android-architecture-components

我没有理由在Android中使用RxJava,在Android Architectural Components中使用LiveData.如果两者之间的用例和差异以及代码形式的示例示例进行解释,这将解释两者之间的差异,这将非常有用.

Bob*_*ish 106

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

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

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

Observable<LocationData> locationObservable;
Run Code Online (Sandbox Code Playgroud)

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

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

Observable<Boolean> isActive;
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式提供LiveData的所有功能

Observable<LocationData> liveLocation =
  isActive
    .switchMap( active -> active ? locationObservable : Observable.never() );
Run Code Online (Sandbox Code Playgroud)

所述switchMap()操作者将或者提供的当前位置作为流,或没有,如果应用程序未激活.一旦你有了liveLocationobservable,你可以使用RxJava运算符做很多事情.我最喜欢的例子是:

liveLocation.distinctUntilChanged()
  .filter( location -> isLocationInAreaOfInterest( location ) )
  .subscribe( location -> doSomethingWithNewLocation( location ) );
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @DanielWilson该链接不再可用. (3认同)
  • 谢谢,LiveData文档似乎不再引用位置示例.这里有更多有趣的点(带位置样本):http://androidkt.com/livedata/ (2认同)
  • “ RxJava的要点是,它使用库提供的操作,甚至您提供的自定义操作,将控制和时序组合到单个Universe中。”但是LiveData并不知道生命周期。如果我们要使用Rx,我们是否必须处理生命周期更改? (2认同)

kzo*_*tin 94

关于原始问题,RxJava和LiveData都非常好地相互补充.

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

目前,我们正在使用RxJava数据源和存储库层,并将其转换为LiveData(使用LiveDataReactiveStreams)ViewModels(在将数据暴露给活动/片段之前) - 对此方法非常满意.

  • 如果我们理解正确,那么LiveData仅对Android UI特定的实现有用.如果我们只是使用Clean Architecture构建通用应用程序,并与其他平台共享此架构,那么RxJava是否比LiveData更适合? (6认同)
  • 你能在你的答案中提出任何 LiveDataReactiveStreams 的工作示例吗? (3认同)
  • @kzotin你不需要`observeOn`,`LiveDataReactiveStreams`无论如何通过调用`LiveData.postValue()`来做到这一点.并且无法保证您的`subscribeOn'一般会产生任何影响. (2认同)
  • 我在大书呆子牧场上发现了这篇很棒的文章 [RxJava 与 LiveData 相遇的地方](https://www.bignerdranch.com/blog/livedatareactivestreams-where-rxjava-meets-livedata/) (2认同)

Abh*_*mar 50

LiveData和RxJava之间存在许多差异

  1. LiveData不是STREAM,而在Rxjava中,所有东西(字面上都是)都是STREAM.
  2. LiveData是同步的,所以你不能像使用Rxjava一样只使用LiveData异步执行一大块代码(nework调用,数据库操作).
  3. 你可以做的最好的事情就是利用Rxjava来实现业务逻辑(网络调用,数据处理等,在Repository内外发生的任何事情),并使用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. 当您使用带有RxJava的LiveData时,您不需要MediatorLiveData,SwitchMap等内容.它们是流控制工具,RxJava在这方面做得好多次.
  8. 将LiveData视为数据持有者而不是其他内容.我们还可以说LiveData是生命周期感知的消费者.

        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();
             }
        }
    
    Run Code Online (Sandbox Code Playgroud)

  • 将LiveData视为数据持有者,别无其他。==&gt;是 (3认同)
  • 我认为使用 Rx 进行网络调用是一种反模式。大多数事物都不是流。我知道。真是令人震惊。但他们不是。围绕 Rx 构建生活的人们嘴上说是这样,但实际上并非如此。除非您使用订阅,否则网络调用只有一个结果。具有单一结果的流是愚蠢的。这就像因为你有锤子而把一切都当作钉子一样。 (3认同)
  • 很好的例子。您忘记了声明一次性物品,最好在onCleared中清除它们。 (2认同)

Ali*_*Nem 28

其实,LiveData 不是本质的不同工具RxJava,所以它为什么引入的架构组件时,RxJava可以通过所有订阅存储到可观察的很容易地管理生命周期的 CompositeDispoable 对象,然后在释放他们onDestroy()Activity 或者onDestroyView() 在中Fragment 只使用一个代码行?

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

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

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

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


  • "当RxJava可以通过将所有订阅存储在CompositeDispoable中然后将它们放置在Activity的onDestroy()中来轻松管理生命周期时,为什么会引入它? - `LiveData`实际上会在`onStop`中部署 (2认同)

tro*_*tto 24

正如您在反应式生态系统中所知,我们有一个发出数据的Observable和一个订阅(获得通知)此Observable发射的观察者,没有什么奇怪的是如何工作所谓的观察者模式.一个Observable"喊"一些东西,Observer得到通知Observable在特定时刻喊出一些东西.

认为LiveData是一个Observable,允许您管理处于active状态的观察者.在其他方面LiveData是一个简单的可观察,但也需要在生命周期的服务.

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

A)实时数据

B)RXJava

A)这是LiveData的基本实现

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

2)在Main Activity(而不是ViewModel)的OnCreate方法中,你"订阅"一个Observer对象(通常是一个onChanged方法)

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

首先ViewModel(拥有业务逻辑)

class ViewModel : ViewModel() { //Point 1

    var liveData: MutableLiveData<Int> = MutableLiveData()

}
Run Code Online (Sandbox Code Playgroud)

这就是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
        })


        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
       }
    });
Run Code Online (Sandbox Code Playgroud)

特别LiveDataLifecycleViewModel(并且经常)(如我们所见)架构组件一起使用.实际上,当LiveData与ViewModel结合使用时,您可以实时更新Observer中的每个更改,以便在需要的地方实时管理事件.LiveData强烈建议使用生命周期的概念和相关对象LifeCycleOwner/LifeCycle,如果你想在现实生活场景中实现,我建议你看看转换LiveData.在这里你可以找到一些伟大的commonswear的用例.

包裹起来基本上LiveData是一个简化的RXJava观察在多个成分的变化,而无需创建组件之间明确的所谓的相关性规则,这样就可以测试更容易的代码,使其更具可读性,一种优雅的方式.RXJava,允许你做LiveData的事情等等.由于RXJava的扩展功能,您既可以使用LiveData来处理简单的情况,也可以利用RXJava的所有功能继续使用Android架构组件作为 ViewModel,当然这意味着RXJava可以更加复杂,只需要考虑运营商的hundreads SwitchMap和LiveData地图(目前).

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


SIV*_*R.J 5

LiveData 是由 android 团队开发的 android 架构组件的子集。

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

如果您只想在 Android 应用程序开发中使用,请选择 Android 架构组件。否则,如果您想使用其他 Java 应用程序,如 Web 应用程序、桌面应用程序等,请使用 RxJava