项目地址:项目地址包含之前的内容
public abstract class LiveData<T> {}
虽然是一个抽象类,但是它并没有抽象方法。
根据文档介绍:LiveData是一个给定生命周期内的数据持有类。就需要一个观察者和生命周期拥有者进行关联,这样当数据变化的时候就能通知观察者了。
- 生命周期拥有者,LifecycleOwner
- 一个生命周期观察者,LifecycleObserver。
- 一个数据变化的观察者,Observer。
- 一个数据处理者,LiveData
示例
- 新建一个数据处理者
TestLiveData
class TestLiveData(val context: Context) : LiveData<Boolean>() {
val tag="TestLiveData"
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
var cm: ConnectivityManager = context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
var networkInfo = cm.activeNetworkInfo
//是否有网
if (networkInfo == null) {
value = false
return
}
//修改值
value = networkInfo.isConnected
}
}
//激活状态的时候调用如onStart之后调用
override fun onActive() {
super.onActive()
Log.e("life", "$tag onActive")
val intentFilter = IntentFilter()
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
context.registerReceiver(broadcastReceiver, intentFilter)
}
//如onStop之前调用
override fun onInactive() {
super.onInactive()
Log.e("life","$tag onInactive")
context.unregisterReceiver(broadcastReceiver)
}
}
监听网络连接的变化,不断改变value的值。
- 生命周期拥有者
LiveDataActivity
class LiveDataActivity : BaseActivity() {
companion object {
fun start(context: Context) {
val starter = Intent(context, LiveDataActivity::class.java)
context.startActivity(starter)
}
}
//初始化TestLiveData 对象
private val testLiveData: TestLiveData by lazy {
TestLiveData(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_live_data)
//关联生命周期拥有者和数据观察者
testLiveData.observe(this, Observer<Boolean> {
var message = if (it!!) "网络连接成功" else "网络连接失败"
tv.text = message
})
}
}
TestLiveData 我们调用了observe方法,完成了另外的三步。其中我们只需要关心,数据观察者的回调方法实现。LifecycleOwner、LifecycleObserver这两步Android已经帮我做好了。
数据改变通知回调
@MainThread
protected void setValue(T value) {
assertMainThread("setValue");
mVersion++;
mData = value;
dispatchingValue(null);
}
...
private void considerNotify(ObserverWrapper observer) {
...
observer.mLastVersion = mVersion;
//noinspection unchecked回调数据
observer.mObserver.onChanged((T) mData);
...
}
...
这样每当数据变化的时候,生命周期出入Active状态,都会dispatchingValue出去,最终回调到数据观察者的onChanged方法。
而且文档提到如果调用的是observeForever,则何时都能观察到。需要自己控制removeObserver的操作。