首页
学习
活动
专区
圈层
工具
发布

Android livedata 源码解剖

当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调...而当 lifecycle 的 state 为 started 或者 resume 的时候,shouldBeActive 方法的返回值为 true,即表示激活。...当 mActive 为 true 时,会促发 dispatchingValue 方法。...,当 activity 生命周期变化的时候,如果不是处于激活状态,判断是否需要 remove 生命周期,需要 remove,不需要,直接返回 当处于激活状态的时候,会判断是不是 mVersion最新版本...,返回,等到下次处于激活状态的时候,在进行相应的处理 如果你想 livedata setValue 之后立即回调数据,而不是等到生命周期变化的时候才回调数据,你可以使用 observeForever 方法

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android  JetPack~ ViewModel (一)   介绍与使用

    设备信息发生变更数据不会丢失(切横竖屏),其实它只有一个生命周期,检测页面销毁时触发 ViewModel 的另一个特点就是同一个 Activity 的 Fragment 之间可以使用ViewModel实现共享数据...真正退出后,它会调用,而不是销毁后调用,因为旋转屏幕也会调用onDestroy。...平常开发中不做任何操作时,如果有网络请求中,Activity被销毁,那么极有可能请求成功返回结果到activity中造成泄漏等不必要的麻烦。...网络请求时,突然销毁activity,那么与之绑定的viewmodel也会销毁,同时我们在onCleared()方法中取消网络连接接口(call.cancel()),就算是有数据返回,activity也不会收到通知...create是创建一个新的实例,而get是先从HashMap中找,找不到就创建新的实例。

    2.2K40

    Jetpack组件之LiveData

    首语 ViewModel 以注重生命周期的方式存储和管理界面相关的数据,当数据发生变化时,可通过接口的方式通知页面,但是有很多数据要通知时,需要定义大量的接口显得十分冗余,为此,Jetpack提供了LiveData...不会因Activity停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。...LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。 数据始终保持最新状态 如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。...例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。 适当的配置更改 如果由于配置更改(如设备旋转)而重新创建了Activity或Fragment,它会立即接收最新的可用数据。...= mHashMap.get(eventName); if (liveData == null) { liveData = new StickyLiveData

    1.2K30

    阿里Android三面真题,想进阿里关于LiveData的这三个问题你至少得答出来

    image.png 今天一起来看看阿里面试真题LiveData的有关问题: LiveData 是什么? LiveData 为什么被设计出来,解决了什么问题? 说说LiveData原理。...("test") LiveData 为什么被设计出来,解决了什么问题?...不会因 Activity 停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。...你要说你擅长 UI,是不是意味着你其他能力就不行?虽然我不知道面试官的用意,但是我能感觉到,这个问题不是那么好回答,我会回答说自己都行,来什么业务接什么需求。...so,出去面试时先看看自己复习到了哪个阶段就好。

    81700

    Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)

    认识 ViewModel 1.1 为什么要使用 ViewModel?...当 Activity 因配置变更而重建时,我们可以将页面上的数据或状态可以定义为 2 类: 第 1 类 - 配置数据: 例如窗口大小、多语言字符、多主题资源等,当设备配置变更时,需要根据最新的配置重新读取新的数据...而前 2 种情况都属于非配置变更触发的,在 Activity 中存在 1 个 Lifecycle 监听:当 Activity 进入 DESTROYED 状态时,如果 Activity 不处于配置变更重建的阶段...ViewModel 必须持有回调监听器的强引用,而不能使用匿名内部类,这会带来编码复杂性); 方法 3: 使用 EventBus 代替回调监听器(这会带来编码复杂性); 方法 4: 使用 LiveData...又由于内存空间相对较大,因此可以存储大数据,但会受到内存空间限制; 2、onSaveInstanceState() :使用场景针对于应用被系统回收后重建时对数据的恢复,由于应用进程在这个过程中会消亡,因此不能选择内存存储而只能选择使用持久化存储

    1.8K20

    有小伙伴说看不懂 LiveData、Flow、Channel,跟我走

    为什么要使用 Flow?...当一个订阅者停止监听时,数据流不会自动关闭(除非使用 WhileSubscribed 策略,这个在下文再说)。 ---- 3....当然 SharedFlow 也并不是完胜,LiveData 能够处理生命周期安全问题,而 SharedFlow 不行(因为 Flow 本身就不是纯 Android 生态下的组件),不合理的使用会存在不必要的操作和资源浪费...LifecycleContinueScope.launchWhenX: 在生命周期到达指定状态时立即启动协程执行代码块,在生命周期低于该状态时挂起(而不是取消)协程,在生命周期重新高于指定状态时,自动恢复该协程...Google 的建议 是优先使用 Flow 而不是 Channel,主要原因是 Flow 会更自动地关闭数据流,而一旦 Channel 没有正常关闭,则容易造成资源泄漏。

    3.4K10

    浅谈ViewModel

    1 主要功能 Activity、Fragment存活期间的数据存储; bind同一Activity的多个Fragment间数据共享; 独立或与LiveData配合实现代码解耦; 2 使用方法 1) 引入...通过Demo,以及LiveData、ViewModel同处一个module,可以看出官方非常建议两者搭配使用。再配合以往的Data-Binding,可以快速搭建起一套简易的MVVM业务体系。...= null) { return holder; }else { holder = (HolderFragment)this.mNotCommittedActivityHolders.get...其实并没有那么复杂,ViewModel在第一次调用ViewModelProvider.get(ViewModel.class)创建;而销毁就需要靠HolderFragment自己的onDestroy()...这也解释了创建ViewModelProvider时为什么需要HolderFragment配合,HolderFragment掌控了ViewModel的生命周期。

    2.9K90

    Android从零开始搭建MVVM架构(4)——LiveData

    确保在ViewModel而不是Activity或Fragment中保存用来更新UI的LiveData对象,原因如下: 避免臃肿的Activity和Fragment。...这些UI控制器负责显示数据而不是保存数据状态。 将LiveData实例与特定Activity或Fragment实例分离,这将使得LiveData对象在配置更改后仍然存活。...当更新数据库时,会生成所有必要的代码来更新LiveData对象。 生成的代码在需要时在后台线程上异步运行查询。 这种模式对于保持用户界面中显示的数据与存储在数据库中的数据同步很有用。...除非Observer正在观看返回的LiveData对象,否则不会计算转换。 由于转换是延迟计算的,所以与生命周期相关的行为隐式传递,而不需要额外的显式调用或依赖关系。...另外,如果UI组件被重新创建,它会触发对repository.getPostCode()方法的另一个调用,而不是使用前一个调用的结果。

    3.2K30

    Android LiveData 使用详解

    ---- 为什么要引进 LiveData LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment或Service 等组件的生命周期。...当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调...回想一下,在你的项目中,是不是经常会碰到这样的问题,当网络请求结果回来的时候,你经常需要判断 Activity 或者 Fragment 是否已经 Destroy, 如果不是 destroy,才更新 UI...而当你如果使用 Livedata 的话,因为它是在 Activity 处于 onStart 或者 onResume 的状态时,他才会进行相应的回调,因而可以很好得处理这个问题,不必谢一大堆的 activity.isDestroyed...当该方法回调时,表示他所有的 obervers 没有一个状态处理 STARTED 或者 RESUMED,注意,这不代表没有 observers。

    5.1K40

    “终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握!

    源数据使用LiveData包装后,可以被observer观察,数据有更新时observer可感知。...1.2 特点 使用 LiveData 具有以下优势: 确保界面符合数据状态,当生命周期状态变化时,LiveData通知Observer,可以在observer中更新界面。...观察者可以在生命周期状态更改时刷新界面,而不是在每次数据变化时刷新界面。 不会发生内存泄漏,observer会在LifecycleOwner状态变为DESTROYED后自动remove。...例如,曾经在后台的 Activity 会在返回前台后,observer立即接收最新的数据。 二、LiveData的使用 下面介绍LiveData的使用,掌握使用方法也可以更好理解上面的内容。...* 观察者只在LifecycleOwner活跃时接受事件,如果变为DESTROYED状态,observer自动移除。 * 当数据在非活跃时更新,observer不会接收到。

    4.5K30

    谷歌官方Android应用架构库——LiveData

    vonInactive():当 LiveData 没有任何处于活动状态的观察者时该方法被调用。由于没有观察者在监听,所以没有理由保持与 LocationManager 的连接。...LiveData 有以下优点: 没有内存泄漏:因为 Observer 被绑定到它们自己的 Lifecycle 对象上,所以,当它们的 Lifecycle 被销毁时,它们能自动的被清理。...信息,以便只有在观察者观察到 LiveData 的返回时才运算这些转换。...此外,如果 UI 被重新创建,它将会触发新的 repository.getPostCode() 调用,而不是使用之前的调用结果。 不能使用那种方式,而应该实现将地址输入转换为邮政编码信息。...可以使用 MediatorLiveData 实现自己的转换,MediatorLiveData 是为了用来正确的监听其它 LiveData 实例并处理它们发出的事件而特别创建的。

    1.5K30

    LiveData 还有学习的必要吗?—— Jetpack 系列(2)

    认识 LiveData 1.1 为什么要使用 LiveData?...: 当宿主生命周期进入消亡(DESTROYED)状态时,LiveData 会自动移除观察者,避免内存泄漏; 2、安全地回调数据: 在宿主生命周期状态低于活跃状态(STAETED)时,LiveData 不会回调数据...,避免产生空指针异常或不必要的性能损耗;当宿主生命周期不低于活跃状态(STAETED)时,LiveData 会重新尝试回调数据,确保观察者接收到最新的数据。...而观察者的持有的初始版本号是 -1,因此当注册新观察者并且正好宿主的生命周期是大于等于可见状态(STARTED)时,就会尝试分发数据,这就是数据重放。...LiveData 重放问题需要区分场景来看 —— 状态适合重放,而事件不适合重放: 当 LiveData 作为一个状态使用时,在注册新观察者时重放已有状态是合理的; 当 LiveData 作为一个事件使用时

    4.1K10

    LiveData详细分析

    LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化。...自动解除数据订阅 要想使用LiveData(或者这种有可被观察数据能力的类)就必须配合实现了LifecycleOwner的对象使用。在这种情况下,当对应的生命周期对象DESTORY时,才能移除观察者。...不会再产生由于Activity处于stop状态而引起的崩溃 例如:当Activity处于后台状态时,是不会收到LiveData的任何事件的。...当我们采用LiveData保存数据时,因为数据和组件分离了。当组件被recreate,数据还是存在LiveData中,并不会被销毁。...f.为什么观察者只能与一个LifecycleOwner绑定,而不是多个?

    3.3K00

    “终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!

    而Activity的正常销毁(系统不会重建Activity)时,ViewModel对象是会清除的。...而ViewModel是不需要持有UI层引用的,那结果怎么给到UI层呢?答案就是使用上一篇中介绍的基于观察者模式的LiveData。...这样,当这两个 Fragment 各自获取 ViewModelProvider 时,它们会收到相同的 SharedViewModel 实例(其范围限定为该 Activity)。...在获取ViewModel实例时,我们并不是直接new的,而是使用ViewModelProvider来获取,猜测关键点应该就在这里了。...4.1 使用场景 在我很久之前一篇文章《Activity生命周期》中有提到: onSaveInstanceState调用时机: 当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState

    2.2K10

    Jetpack源码解析---ViewModel基本使用及源码解析

    Jetpack源码解析—LiveData的使用及工作原理 上篇我们对LiveData进行了分析,已清楚了它的主要作用,我们再来温习一下: LiveData是一个可以感知Activity、Fragment...其本身是基于观察者模式设计的,当LiveData所持有的数据发生改变时,它会通知对应的界面所持有该数据的UI进行更新,并且LiveData中持有Lifecycle的引用,所以只会在LifecycleOwner...而LiveData配合今天所讲的ViewModel使用起来真的是非常方便,接下来我们开始分析: 2.简介 2.1 是什么?...基本使用 3.1 数据存储 我们参考官方Demo实现一个计时器的功能,并且演示当屏幕发生旋转时,计时器会不会重新启动: DemoViewModel class DemoViewModel : ViewModel...FragmentActivity继承了它,而ComponentActivity里面通过Lifecycles观察生命周期,当接受到ON_DESTROY的事件时,清空VM。 5.

    1K20
    领券