Jetpack LiveData使用(一)

目录

LiveData有哪些优势?

LiveData 使用


LiveData有哪些优势?

LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment或Service 等组件的生命周期。LiveData 是可被观察的数据持有类。具有生命周期(Activity/Fragment/Service)感知的(确保active状态下接受data更新

 简单来说,他主要有一下优点。

  1. 它可以做到在组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI。
  2. 不用担心发生内存泄漏
  3. 当 config 导致 activity 重新创建的时候,不需要手动取处理数据的储存和恢复,它已经帮我们封装好了。
  4. 当 Actiivty 不是处于激活状态的时候,如果你想 livedata setValue 之后立即回调 obsever 的 onChange 方法,而不是等到 Activity 处于激活状态的时候才回调 obsever 的 onChange 方法,你可以使用 observeForever 方法,但是你必须在 onDestroy 的时候 removeObserver。

回想一下,在你的项目中,是不是经常会碰到这样的问题,当网络请求结果回来的时候,你经常需要判断 Activity 或者 Fragment 是否已经 Destroy, 如果不是 destroy,才更新 UI。而当你如果使用 Livedata 的话,因为它是在 Activity 处于 onStart 或者 onResume 的状态时,他才会进行相应的回调,因而可以很好得处理这个问题,不必谢一大堆的 activity.isDestroyed()。

接下来,让我们一起来看一下 LiveData 的使用。

LiveData 使用

LiveData是抽象类 ,MutableLiveData 是它的实例对象

//声明一个liveData
val liveA = mutableLiveData<String>()
//在需要的时候赋值
liveA.value = "some value of liveA"

//
//在UI中,观察,在active状态下可以感知变化
val liveAObserver = Observer<String>{
    value?.let{
        //do something
    }
}
liveA.observe(vivewLifeCycleOwner,liveAObserver)

步骤一:先创建出MutableLiveData 一个实例对象,这个对象是有

步骤二:注册刚刚创建的MutableLiveData,就可以观察到变化的数据

下面演示一个完整例子:

  1. 步骤一:创建一个activity和一个fragment,利用MutableLiveData创建livedata实例:
    //声明变量livedata
    val liveAppleData = MutableLiveData<String>()
  1. 步骤二:注册一个liveData的观察,当liveData中值变化后设置到UI界面上:

这个是activity的监听和设置值:

        //变更livedata的值
        btn_change_live.setOnClickListener {
            liveAppleData.value = "当前liveData的值:${System.currentTimeMillis()}"
        }

        //观察值
        liveAppleData.observe(this, Observer {
            tv_live_data_activity.text = it
            Log.d("LiveActivity", "LiveData在LiveActivity中 $it")
        })

这个是fragment的设置值,监听用的和activity是用一个对象:

        (requireActivity() as LiveActivity).apply {
            liveAppleData.observe(viewLifecycleOwner, Observer {
                tv_live_apple.text = it
                Log.i("AppleFragment", "LiveData在AppleFragment中 $it")
            })
        }

整体效果如图:

点击改变LiveData按钮,此时activity和fragment中的livedata都监听到数据变化,并直接在UI上更新了时间。此外还演示了,当隐藏掉fragment时,点击改变livedata数据后,再次点击显示fragment时自动获取到了和activity一致的时间值。

activity:

class LiveActivity : AppCompatActivity() {

    //声明变量live data
    val liveAppleData = MutableLiveData<String>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_livedata)
        //Fragment
        val appleFragment = AppleFragment()
        supportFragmentManager.beginTransaction()
            .add(R.id.fl_container_live, appleFragment)
            .commit()
         TODO 注意 hide 和 show不会改变fragment的生命周期状态 所以用attach detach
        //显示fragment
        btn_create_fg_live.setOnClickListener {
            supportFragmentManager.beginTransaction()
                .attach(appleFragment)
                .commit()
            Log.d("LiveActivity", "onCreate: 显示fg ${appleFragment.isVisible}")
        }
        //隐藏
        btn_destroy_fg_live.setOnClickListener {
            supportFragmentManager.beginTransaction()
                .detach(appleFragment)
                .commit()
            Log.w("LiveActivity", "onCreate: 隐藏fg ${appleFragment.isVisible}")

        }
        //变更livedata的值
        btn_change_live.setOnClickListener {
            liveAppleData.value = "当前liveData的值:${System.currentTimeMillis()}"
        }

        //观察值
        liveAppleData.observe(this, Observer {
            tv_live_data_activity.text = it
            Log.d("LiveActivity", "LiveData在LiveActivity中 $it")
        })
    }

}

fragment:

class AppleFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("AppleFragment", "onCreate")
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fg_apple, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        (requireActivity() as LiveActivity).apply {
            liveAppleData.observe(viewLifecycleOwner, Observer {
                tv_live_apple.text = it
                Log.i("AppleFragment", "LiveData在AppleFragment中 $it")
            })
        }
    }

}

项目完整代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值