是时候更新手里的武器了—Jetpack架构组件简析( 四 )


LiveData 是一种可观察的数据存储器类 。等等 , 这个介绍好像似曾相识?对 , 前面说数据绑定的时候就有一个可观察的数据对象ObservableField 。那两者有什么区别呢?
1)LiveData 具有生命周期感知能力 , 可以感知到Activity等的生命周期 。这样有什么好处呢?很常见的一点就是可以减少内存泄漏和崩溃情况了呀 , 想想以前你的项目中针对网络接口返回数据的时候都要判断当前界面是否销毁 , 现在LiveData就帮你解决了这个问题 。
具体为什么能解决崩溃和泄漏问题呢?

  • 不会发生内存泄漏 观察者会绑定到 Lifecycle 对象 , 并在其关联的生命周期遭到销毁后进行自我清理 。
  • 不会因 Activity 停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity) , 则它不会接收任何 LiveData 事件 。
  • 自动判断生命周期并回调方法 如果观察者的生命周期处于 STARTED 或 RESUMED状态 , 则 LiveData 会认为该观察者处于活跃状态 , 就会调用onActive方法 , 否则 , 如果 LiveData 对象没有任何活跃观察者时 , 会调用 onInactive()方法 。
2) LiveData更新数据更灵活 , 不一定是改变数据 , 而是调用方法(postValue或者setValue)的方式进行UI更新或者其他操作 。
好了 。还是举个更直观的看看吧:
//导入库:implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"class StockLiveData(symbol: String) : LiveData<BigDecimal>() {private val stockManager = StockManager(symbol)private val listener = { price: BigDecimal ->value = https://www.isolves.com/it/cxkf/jiagou/2020-08-02/price}override fun onActive() {stockManager.requestPriceUpdates(listener)}override fun onInactive() {stockManager.removeUpdates(listener)}}public class MyFragment : Fragment() {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)val myPriceListener: LiveData = StockLiveData("")myPriceListener.observe(this, Observer { price: BigDecimal? ->// 监听livedata的数据变化 , 如果调用了setValue或者postValue会调用该onChanged方法//更新UI数据或者其他处理})}}这是一个股票数据对象 , StockManager为股票管理器 , 如果该对象有活跃观察者时 , 就去监听股票市场的情况 , 如果没有活跃观察者时 , 就可以断开监听 。当监听到股票信息变化 , 该股票数据对象就会通过setValue方法进行数据更新 , 反应到观察者的onChanged方法 。这里要注意的是setValue方法只能在主线程调用 , 而postValue则是在其他线程调用 。当Fragment这个观察者生命周期发生变化时 , LiveData就会移除这个观察者 , 不再发送消息 , 所以也就避免崩溃问题 。
Navigation
导航 Navigation 组件旨在用于具有一个主 Activity 和多个 Fragment 目的地的应用 。主 Activity 与导航图相关联 , 且包含一个负责根据需要交换目的地的 NavHostFragment 。在具有多个 Activity 目的地的应用中 , 每个 Activity 均拥有其自己的导航图 。
所以说白了 , Navigation就是一个Fragment的管理框架 。怎么实现?创建Activity , Fragment , 进行连接 。
1)导入库
def nav_version = "2.3.0"implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"implementation "androidx.navigation:navigation-ui-ktx:$nav_version"2)创建3个Fragment和一个Activity
3)创建res/navigation/my_nav.xml 文件
<?xml version="1.0" encoding="utf-8"?><navigation xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"xmlns:android="http://schemas.android.com/apk/res/android"app:startDestination="@id/myFragment1"tools:ignore="UnusedNavigation"><fragmentandroid:id="@+id/myFragment1"android:name="com.example.studynote.blog.jetpack.navigation.MyFragment1"android:label="fragment_blank"tools:layout="@layout/fragmetn_my_1" ><actionandroid:id="@+id/action_blankFragment_to_blankFragment2"app:destination="@id/myFragment2" /></fragment><fragmentandroid:id="@+id/myFragment2"android:name="com.example.studynote.blog.jetpack.navigation.MyFragment1"android:label="fragment_blank"tools:layout="@layout/fragmetn_my_1" ><actionandroid:id="@+id/action_blankFragment_to_blankFragment2"app:destination="@id/myFragment3" /></fragment><fragmentandroid:id="@+id/myFragment3"android:name="com.example.studynote.blog.jetpack.navigation.MyFragment1"android:label="fragment_blank"tools:layout="@layout/fragmetn_my_1" ></fragment></navigation>


推荐阅读