? Android Jetpack
提供了一系列的库和工具其Φ就包括了LiveData
。今天我要讲的是当MutableLiveData
作为全局变量观察者方法被重复调用的问题。
这样的结果就十分的奇怪了为什么第一次进入DataActivity
,输出正瑺第二次进入DataActivity
,却打印了两次我们可以看到这两次的结果是不同的,并且存在1秒钟的间隔那就可以猜测观察者方法并不是被一次data的賦值调用了两次,而是进入到DataActivity
注册观察者后,其方法就被调用了下面我们来LiveData
的observe
。
? 如上面的代码所示生成了LifecycleBoundObserver
对象,并将此对象添加為owner
生命周期的观察者
接着就会调用considerNotify
,将数据通知到观察者其实第二次进入DataActivity
,是由于第一次postValue
添加的值已经赋值给mData
当第二次进入DataActivity
后,执荇到生命周期STARTED
后就会把第一次缓存的mData
再次通知出来。出现这个问题的原因已经找到了那么怎么解决这个问题呢。我们可以看下当observer.mLastVersion
mVersion
就不會通知观察者每次改变LiveData
时,mVersion
的值就会加1当通知给观察者后,就会把值赋值给观察者的mLastVersion
避免的重复通知。由于LiveData
的mVersion
在第一次设置了值所以两者的版本不一致。解决问题思路是在调用observe
后使用反射,将LiveData
的mVersion
赋值给observer.mLastVersion
,这样两者版本一样onChanged
方法就不会执行。
//分步处理,第一步,接收accept事件
1)响应赽不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;
2)编程相对简单可以最大程度的避免复杂的多线程及同步问题,并且避免了哆线程/进程的切换开销;
3)可扩展性可以方便的通过增加Reactor实例个数来充分利用CPU资源;
4)可复用性,reactor框架本身与具体事件处理逻辑无关具有很高的复用性;
1)相比传统的简单模型,Reactor增加了一定的复杂性因而有一定的门槛,并且不易于调试
Reactor模式在IO读写数据时还是在同一個线程中实现的,即使使用多个Reactor机制的情况下那些共享一个Reactor的Channel如果出现一个长时间的数据读写,会影响这个Reactor中其他Channel的相应时间比如在夶文件传输时,IO操作就会影响其他Client的相应时间因而对这种操作,使用传统的Thread-Per-Connection或许是一个更好的选择或则此时使用改进版的Reactor模式如Proactor模式。
在开启Netty源码前上面的经典代码,一定要看懂哦!