不会发生内存泄漏,observer会在LifecycleOwner状态变为DESTROYED后自动remove。...数据始终保持最新状态,数据更新时 若LifecycleOwner为非活跃状态,那么会在变为活跃时接收最新数据。...最后用LifecycleOwner的Lifecycle添加observer的封装wrapper。...plug()中让源LiveData调用observeForever方法添加永远观察者-自己。...这里为啥使用observeForever方法呢,这是因为源LiveData在外部使用时不会调用observer方法添加观察者,这里永远观察是为了在源LiveData数据变化时及时回调到 mObserver.onChanged
如下图所示: LifecycleOwner接口只有getLifecycle()这一个方法,LifecycleOwner正是通过该方法实现观察者模式的。...MyLocationListener","stopGetLocation"); } public interface OnLocationChangedListener{ void onChanged...public void onLocationChanged(@NonNull Location location) { onLocationChangedListener.onChanged...new MyLocationListener.OnLocationChangedListener() { @Override public void onChanged...不过需要注意的是,onDestroy()永远不会调用,系统不会分发调用这个事件。 Lifecycle的用法到这里就基本讲解完毕了,怎么样,感觉如何?
b.如何做到感知生命周期的,怎么跟 LifecycleOwner 进行绑定的? c.LiveData 只在 LifecycleOwner active 状态发送通知,是怎么处理的?...f.为什么观察者只能与一个LifecycleOwner绑定,而不是多个?...setValue ——> dispatchingValue(null) ——> considerNotify(注意,这里是个for迭代器循环,表示通知所有观察者) ——> onChanged 09.observeForever...看一下源代码 将给定的观察者添加到观察者列表中,意味着给定的观察者将接收所有事件,并且永远不会被自动删除,不管在什么状态下都能接收到数据的更改通知@MainThread public void observeForever...但是不发送通知,等 owner 回到 active 的状态下,再发送通知; 使用observeForever()方法,会注意AlwaysActiveObserver对象,意味着给定的观察者将接收所有事件,并且永远不会被自动删除
Observer nameObserver = new Observer() { @Override public void onChanged...//Log里面会显示hhhh } }); 3.源码解析 public void observe(@NonNull LifecycleOwner owner, @NonNull...//这里调用dispatchingValue,里面会看到遍历Observer然后调用considerNotify //再里面就会看到observer.mObserver.onChanged...((T) mData) //也就是nameObserver的onChanged方法 } @Override boolean isAttachedTo...(LifecycleOwner owner) { return mOwner == owner; } @Override void
LifecycleOwner就理解成我们的Fragment或者Activity的实例,因为它们都实现了LifecycleOwner。...super S> onChanged) { Source e = new Source(source, onChanged); SourceonChanged) { throw new IllegalArgumentException( "This source was already...从observeForever()用法可以看到,我们并没有传递LifecycleOwner,因此它并不具备生命感知能力。...5.总结 LiveData基于观察者模式实现,并且和LifecycleOwner进行绑定,而LifecycleOwner又被Fragment和Activity实现,所以它可以感知生命周期;在当前的LifecycleOwner
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<?...activity中使用 myViewModel.getmStr().observe(this, new Observer() { @Override public void onChanged...super T> observer) 移除指定的观察者 removeObservers(@NonNull final LifecycleOwner owner) 移除当前Activity...observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) 1.设置永远观察者,永远不会被自动删除。
Nullable T t) { if (mPending.compareAndSet(true, false)) { observer.onChanged...{ if (pending.compareAndSet(true, false)) { observer.onChanged(t)...11/2018更新 正如我团队中的一位成员所提到的,我忘记了在removeObservers方法中处理所有者:LifecycleOwner!这可能是一个问题。...{ if (pending.compareAndSet(true, false)) { observer.onChanged(t)...为了永远解决这个问题,我创建了一个库,里面有足够的测试来显示我的假设并验证它们。
实际使用下来发现 LiveData 有几个特性: LiveData 的实现基于观察者模式; LiveData 跟 LifecycleOwner 绑定,能感知生命周期变化,并且只会在 LifecycleOwner...new MutableLiveData(); liveString.observe(this, new Observer() { @Override public void onChanged...("程序亦非猿"); 运行后可以看到日志输出:onChanged() called with: s = [程序亦非猿] 。...此时的流程是: observe--> onStateChanged--> activeStateChanged--> dispatchingValue--> considerNotify--> onChanged...知识点汇总 LiveData 的实现基于观察者模式; LiveData 跟 LifecycleOwner 绑定,能感知生命周期变化,并且只会在 LifecycleOwner 处于 Active 状态(STARTED
postValue(stickyData); } @Override public void observe(@NonNull LifecycleOwner...{ observerSticky(owner, observer, false); } public void observerSticky(LifecycleOwner...LifecycleEventObserver() { @Override public void onStateChanged(@NonNull LifecycleOwner...(t); } } } } LiveData的原理 LiveData的observe()方法接收两个参数,第一个是LifecycleOwner,第二个是Observer...@MainThread public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<?
lifecycleOwner = mLifecycleOwner.get(); if (lifecycleOwner == null) { Log.w...mVersion) { return; } observer.mLastVersion = mVersion; // 最终调用观察者的onChanged...()回调 observer.mObserver.onChanged((T) mData); //最后到这里 } 3、LiveData注册Observer 添加观察者过程实际上是把...liveData.observe(this, new Observer() { @Override public void onChanged...= null) { return; } LifecycleOwner lifecycleOwner = mLifecycleOwner.get()
2.创建一个定义了onChanged()方法的Observer对象,当LiveData对象保存的数据发生变化时,onChanged()方法可以进行相应的处理。...observe()方法还需要一个LifecycleOwner对象作为参数。 Observer对象订阅了LiveData对象,便会在数据发生变化时发出通知。...注意:可以使用observeForever(Observer)方法注册一个没有关联LifecycleOwner对象的Observer。...当你更新LiveData对象中存储的数据时,所有注册了的Observer,只要所绑定的LifecycleOwner处于活动状态,就会被触发通知。...setInput(String address) { addressInput.setValue(address); } } 在这种情况下,postalCode字段是公开的和最终的,因为该字段永远不会改变
mOwner; LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer observer) {...@MainThread public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {...} while (mDispatchInvalidated); mDispatchingValue = false; } 在 dispatchingValue 就是循环遍历...observer.mLastVersion = mVersion; //noinspection unchecked // 调用 Observer 的 onChanged...方法实现回调 observer.mObserver.onChanged((T) mData); } 好啦,到这里就把 LiveData 整个流程讲的差不多了。
MutableLiveData(); liveData.observe(this, new Observer() { @Override public void onChanged...// mDispatchingValue 赋值 true // 此时如果下一次 setValue 触发,上面的 mDispatchInvalidated 变为 true,下面 for 循环打断退出...,并且重新执行 do- //while 循环,这样就能保证再次分发通知是最新的数据值(这几个标记的 boolean 变量主要也是处理并发问题) mDispatchingValue...= true; do { mDispatchInvalidated = false;// 默认只会执行一次 do-while 循环 if...observer.mLastVersion = mVersion; //noinspection unchecked // 回调通知 observer.mObserver.onChanged
这个调用类似于{@link LiveData#observe(LifecycleOwner, Observer)} 和一个LifecycleOwner, which总是积极的。...这意味着给定的观察者将接收所有事件,并且永远不会 被自动删除。 您应该手动调用{@link #removeObserver(Observer)}来停止 观察这LiveData。...MutableLiveData源代码,如下所示,这里重点展示测试数据案例public void postValue(T value) { super.postValue(value); } 然后使用for循环...newValue; } @Override public void run() { setValue(newValue); } } - 然后再次使用for循环...LifecycleOwner的生命周期结束的时候,会自动取消订阅。
liveData.observe(this, new Observer() { @Override public void onChanged...timerViewModel.startTiming(); } } 在页面中,通过LiveData.observe()方法对LiveData所包装的数据进行观察,当该数据发生变化的时候,就可以得到更新后的数据,并在onChanged...public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<?...return; } owner.getLifecycle().addObserver(wrapper); } 从源码可以看到,observe方法接收的第一个参数是LifecycleOwner...因此,在用完之后,一定要记得调用removeObserver()方法来停止对LiveData的观察,否则LiveData会一直处于激活状态,Activity则永远不会被系统自动回收,这就造成了内存泄漏。
MutableLiveData(); Observer observer = new Observer() { @Override public void onChanged...比如点击按钮改变 simpleLiveData 的值为 “Hello LiveData” ,就会触发 Observer 的 onChanged 方法 mButton.setOnClickListener...MutableLiveData(); liveData.observeForever(new Observer() { @Override public void onChanged...userMediatorLiveData.addSource(userLiveData1, new Observer() { @Override public void onChanged...userMediatorLiveData.addSource(userLiveData2, new Observer() { @Override public void onChanged
newName); } }; // Observe the LiveData, passing in this activity as the LifecycleOwner...public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) { if (owner.getLifecycle...在什么时候回调Observer的void onChanged(@Nullable T t)呢?...@Override public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {...((T) mData); } 调用onChanged方法。
mObserver = observer; } abstract boolean shouldBeActive(); boolean isAttachedTo(LifecycleOwner...mOwner; LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<?...= mOwner.getLifecycle().getCurrentState(); } } @Override boolean isAttachedTo(LifecycleOwner...dispatchingValue(null); } // 数据分发 void dispatchingValue(ObserverWrapper initiator) { // 这里的标记位和嵌套循环是为了处理在...Observer#onChanged() 中继续调用 setValue(), // 而产生的递归设置数据的情况,此时会中断旧数据的分发,转而分发新数据,这是丢失数据的第 2 种情况。
领取专属 10元无门槛券
手把手带您无忧上云