Android JetPack——LiveData

项目地址:项目地址包含之前的内容

public abstract class LiveData<T> {}

虽然是一个抽象类,但是它并没有抽象方法。
根据文档介绍:LiveData是一个给定生命周期内的数据持有类。就需要一个观察者和生命周期拥有者进行关联,这样当数据变化的时候就能通知观察者了。

  1. 生命周期拥有者,LifecycleOwner
  2. 一个生命周期观察者,LifecycleObserver。
  3. 一个数据变化的观察者,Observer。
  4. 一个数据处理者,LiveData

示例

  1. 新建一个数据处理者
    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的值。

  1. 生命周期拥有者
    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的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值