LiveData.AlwaysActiveObserver @Override boolean shouldBeActive() { //直接返回true return true; } 当调用observeForever...当然,调用observeForever的话,由于他的包装类没有进行removeObserver,需要在业务层手动移除,否则可能会造成内存泄漏, observe:包装类是LifecycleBoundObserver...(有活跃边界),内部会调removeObserver observeForever:包装类是AlwaysActiveObserver (总是活跃),需要手动调removeObserver 优缺点 优点
FloatWindowUtils.addViewContent("LiveData-onChanged: $lifeStatus") } liveData.observeForever...onDestroy() { super.onDestroy() liveData.value = "onDestroy()" } } **注意:**这里我使用了observeForever...值得注意的是,这里使用了mLiveData.observeForever(this);。...从observeForever()用法可以看到,我们并没有传递LifecycleOwner,因此它并不具备生命感知能力。...并且自动帮我们完成observeForever()和removeObserver()。
LiveData 实现原理分析 2.1 注册观察者的执行过程 LiveData 支持使用 observe() 或 observeForever() 两种方式注册观察者,其内部会分别包装为 2 种包装对象...注意: LiveData 内部会禁止一个观察者同时使用 observe() 和 observeForever() 两种注册方式。...但同一个 LiveData 可以接收 observe() 和 observeForever() 两种观察者。...super T> observer) { super.observeForever(createObserverWrapper(observer, mCurrentVersion.get...super T> observer) { super.observeForever(createObserverWrapper(observer, START_VERSION));
五.LiveData.observeForever()方法 LiveData还提供了一个名为observeForever()的方法,它的用法和observe方法相似,主要的区别在于,当LiveData...中的数据发生变化时,无论页面处于什么状态,observeForever()方法都可以收到通知。
对于非生命周期感知的observeForever方法来说,实现的思路是一致的,但是具体的实现略有不同。...observeForever的时候,生成的wrapper不是LifecycleBoundObserver,而是AlwaysActiveObserver(步骤1),而且我们也没有机会在observeForever...调用完成之后再去更改AlwaysActiveObserver的version,因为在observeForever方法体内,步骤3的语句,回调就发生了。...那么对于observeForever,如何解决这个问题呢?既然是在调用内回调的,那么我们可以写一个ObserverWrapper,把真正的回调给包装起来。...把ObserverWrapper传给observeForever,那么在回调的时候我们去检查调用栈,如果回调是observeForever方法引起的,那么就不回调真正的订阅者。
super T> observer) :添加感知生命周期的观察者对象 public void observeForever(Observer<?...MutableLiveData 的使用 前面 Hello LiveData 简单展示了 LiveData 的使用 LiveData 除了依赖生命周期对象实现观察者的自动管理外,还可以添加忽略生命周期的观察者, 使用 observeForever...方法: java: MutableLiveData liveData = new MutableLiveData(); liveData.observeForever(new Observer...String s) { //do something } }); kotlin: val liveData = MutableLiveData() liveData.observeForever...再来看 observeForever 方法: @MainThread public void observeForever(@NonNull Observer<?
其中: onActive 方法会在活动的观察者从 0 变成 1 的时候调用 onInactive 方法会在活动的观察者从 1 变成 0 的时候调用 添加观察者:observeForever 另外,除了...observe 观察以外,还有 observeForever ,这种方式不会进行感知生命周期,具体的流程如下: public void observeForever(@NonNull Observer...super T> observer) { assertMainThread("observeForever"); //和上面不同的是,这里用的是 AlwaysActiveObserver...判断活跃状态的时候直接为 true @Override boolean shouldBeActive() { return true; } } #ObserverWrapper //observeForever
livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法,你可以使用 observeForever...TestViewModel.Factory(mkey)).get(TestViewModel.class) ---- 自定义 Livedata Livedata 主要有几个方法 observe onActive onInactive observeForever...Void observeForever 跟 observe 方法不太一样的是,它在 Activity 处于 onPause ,onStop, onDestroy 的时候,都可以回调 obsever 的...但是,对于你想做一些类似与在后台工作的(黑科技), liveData 就不太适合了,你可以使用 observeForever 方法,或者自己实现观察者模式去吧。
io.github.jeremyliao:live-event-bus-x:1.8.0' } 02 LiveEventBus的使用 在MyService中加入InitLiveEventBus的初始化,上图中可以看到这里使用的是observeforever...lifecycleObserverAlwaysActive(true) .autoClear(false) LiveEventBus.get(MESSAGE_TYPE) .observeForever
@Nullable String s) { } }); 以Forever模式订阅消息 LiveEventBus .get("some_key", String.class) .observeForever....autoClear(false); LiveEventBus.get("module",String::class.java) .observeForever
除了observe()方法外,LiveData还提供了observeForever()方法,该方法允许我们传入一个普通的观察者对象,而不需要绑定到生命周期。...但要注意,使用observeForever()方法需要手动在适当的时机调用removeObserver()方法,否则可能导致内存泄漏。...nameLiveData.observeForever(s -> { // Do something with the updated data }); // 在适当的时机调用removeObserver
另外,除了使用observe()方法添加观察者,也可以使用observeForever(Observer) 方法来注册未关联 LifecycleOwner的观察者。...另外,再看observeForever方法: @MainThread public void observeForever(@NonNull Observer observer) { assertMainThread("observeForever"); AlwaysActiveObserver wrapper...(this);//observeForever } void unplug() { mLiveData.removeObserver(this)...plug()中让源LiveData调用observeForever方法添加永远观察者-自己。
livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法,你可以使用 observeForever...@MainThread public void observeForever(@NonNull Observer observer) { AlwaysActiveObserver wrapper...直接处理,如果不是处理激活状态,返回,等到下次处于激活状态的时候,在进行相应的处理 如果你想 livedata setValue 之后立即回调数据,而不是等到生命周期变化的时候才回调数据,你可以使用 observeForever
我们调用 observeForever 方法内部使用的就是 AlwaysActiveObserver 。 observe 顺便,我们把 observe 方法也一起看了。...还有,另外一个 observeForever 方法就不看了,和 observe 方法差不多。
除非你使用observeForever来观察数据,有兴趣的可以去查看源码来了解实现原理。...mLiveDataTimerViewModel.getElapsedTime().observeForever(elapsedTimeObserver); 3.2 Fragmnet 之间数据共享 public
当然,如果想任何时候都能监听到,都能获取回调,调用observeForever方法即可。 参考 https://juejin.im/post/6844903748574117901
FragmentEvent>(scope = fragment) { ... } //接收 App Scope事件 observeEvent { ... } Like ObserveForever
04.简单使用LiveData 05.observe()和observerForever() 06.LiveData原理介绍 07.observe订阅源码分析 08.setValue发送源码分析 09.observeForever...setValue ——> dispatchingValue(null) ——> considerNotify(注意,这里是个for迭代器循环,表示通知所有观察者) ——> onChanged 09.observeForever...看一下源代码 将给定的观察者添加到观察者列表中,意味着给定的观察者将接收所有事件,并且永远不会被自动删除,不管在什么状态下都能接收到数据的更改通知@MainThread public void observeForever...Active 状态(STARTED/RESUMED)下通知数据改变;如果数据改变发生在非 active 状态,数据会变化,但是不发送通知,等 owner 回到 active 的状态下,再发送通知; 使用observeForever
领取专属 10元无门槛券
手把手带您无忧上云