安卓面试题到处攒,一到面试就忘个干净?来看看这份超详细的整理( 五 )

  • 解决了因为Activity停止而导致的View空指针问题 。在MVVM中使用了LiveData,那么在需要更新View的时候,如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件 。也就是他会保证在界面可见的时候才会进行响应,这样就解决了空指针问题 。
  • 解决了生命周期管理问题 。这主要得益于Lifecycle组件,它使得一些控件可以对生命周期进行观察,就能随时随地进行生命周期事件 。
  • 2)再说说响应式编程
    响应式编程,说白了就是我先构建好事物之间的关系,然后就可以不用管了 。他们之间会因为这层关系而互相驱动 。其实也就是我们常说的观察者模式,或者说订阅发布模式 。
    为什么说这个呢,因为MVVM的本质思想就是类似这种 。不管是双向绑定,还是生命周期感知,其实都是一种观察者模式,使所有事物变得可观察,那么我们只需要把这种观察关系给稳定住,那么项目也就稳健了 。
    3)最后再说说MVVM为什么这么强大?
    我个人觉得,MVVM强大不是因为这个架构本身,而是因为这种响应式编程的优势比较大,再加上Google官方的大力支持,出了这么多支持的组件,来维系MVVM架构,其实也是官方想进行项目架构的统一 。
    优秀的架构思想+官方支持=强大
    ..............
    12、LiveData 是什么?
    LiveData 是一种可观察的数据存储器类 。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期 。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者 。
    官方介绍如下,其实说的比较清楚了,主要作用在两点:
    • 数据存储器类 。也就是一个用来存储数据的类 。
    • 可观察 。这个数据存储类是可以观察的,也就是比一般的数据存储类多了这么一个功能,对于数据的变动能进行响应 。
    主要思想就是用到了观察者模式思想,让观察者和被观察者解耦,同时还能感知到数据的变化,所以一般被用到ViewModel中,ViewModel负责触发数据的更新,更新会通知到LiveData,然后LiveData再通知活跃状态的观察者 。
    var liveData = https://www.isolves.com/it/cxkf/cxy/2020-12-22/MutableLiveData()liveData.observe(this, object : Observer {override fun onChanged(t: String?) {}})liveData.setVaile("xixi")//子线程调用liveData.postValue("test")13、LiveData 为什么被设计出来,解决了什么问题?LiveData作为一种观察者模式设计思想,常常被和RxJAVA一起比较,观察者模式的最大好处就是事件发射的上游 和 接收事件的下游 互不干涉,大幅降低了互相持有的依赖关系所带来的强耦合性 。
    其次,LiveData还能无缝衔接到MVVM架构中,主要体现在其可以感知到Activity等生命周期,这样就带来了很多好处:
    • 不会发生内存泄漏 观察者会绑定到 Lifecycle对象,并在其关联的生命周期遭到销毁后进行自我清理 。
    • 不会因 Activity 停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件 。
    • 自动判断生命周期并回调方法 如果观察者的生命周期处于 STARTED 或 RESUMED状态,则 LiveData 会认为该观察者处于活跃状态,就会调用onActive方法,否则,如果 LiveData 对象没有任何活跃观察者时,会调用 onInactive()方法 。
    14、说说LiveData原理说到原理,其实就是两个方法:
    订阅方法,也就是observe方法 。通过该方法把订阅者和被观察者关联起来,形成观察者模式 。
    简单看看源码:
    @MainThreadpublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {assertMainThread("observe");//...LifecycleBoundObserver wrApper = new LifecycleBoundObserver(owner, observer);ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);if (existing != null && !existing.isAttachedTo(owner)) {throw new IllegalArgumentException("Cannot add the same observer"+ " with different lifecycles");}if (existing != null) {return;}owner.getLifecycle().addObserver(wrapper);}public V putIfAbsent(@NonNull K key, @NonNull V v) {Entry<K, V> entry = get(key);if (entry != null) {return entry.mValue;}put(key, v);return null;}这里putIfAbsent方法是讲生命周期相关的wrapper和观察者observer作为key和value存到了mObservers中 。
    回调方法,也就是onChanged方法 。通过改变存储值,来通知到观察者也就是调用onChanged方法 。从改变存储值方法setValue看起:


    推荐阅读