Android 面试总结 - LiveData

listOf(“张三”, “李四”)

}

}

}

MainViewModel

class MainViewModel: ViewModel() {

private val nameList = MutableLiveData<List>()

val nameListResult: LiveData<List> = nameList

private val mainRepository = MainRepository()

fun getNames() {

// 使用协程模拟请求过程

viewModelScope.launch {

nameList.value = mainRepository.getNameList()

}

}

}

MainActivity

class MainActivity : AppCompatActivity() {

// 创建 ViewModel 方式 1

// 通过 kotlin 委托特性创建 ViewModel

// 需添加依赖 implementation ‘androidx.activity:activity-ktx:1.2.3’

// viewModels() 内部也是通过 创建 ViewModel 方式 2 来创建的 ViewModel

private val mainViewModel: MainViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate (savedInstanceState)

setContentView(R.layout.activity_main)

// 创建 ViewModel 方式 2

val mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)

// 通过 LiveData.observe 订阅观察者

mainViewModel.nameListResult.observe(this, {

Log.i(“MainActivity”, “mainViewModel: nameListResult: $it”)

})

mainViewModel.getNames()

}

}

打开app -> 正常看到日志

18:03:02.575 : mainViewModel: nameListResult: [张三, 李四]

源码解析

====

LiveData 通过 observe 方法来订阅观察者,以此为查看源码的入口:

方法注释包含的知识很多,请认真阅读注释 (百度翻译过来的)。

private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =

new SafeIterableMap<>();

/**

  • 1、在给定 owner 的生命周期内,将给定的观察者添加到观察者列表中。

  • 2、事件在主线程上调度。

  • 3、如果LiveData已经有数据集,它将被交付给观察者。

  • 4、仅当所有者处于{@link Lifecycle.State#STARTED}或{@link Lifecycle.State#RESUME}状态

*(活动)时,观察者才会接收事件。

  • 5、如果所有者移动到{@link Lifecycle.State#DETROYED}状态,观察者将自动被删除。

  • 6、当数据在{@code owner}未激活时发生更改时,它将不会收到任何更新。

  • 7、如果它再次激活,它将自动接收最后可用的数据。

  • 8、只要给定的LifecycleOwner未被销毁,LiveData就会保留对观察者和所有者的强引用。

  • 9、销毁后,LiveData将删除对所有者的引用。

  • 10、如果给定的所有者已经处于{@link Lifecycle.State#DESTROYED}状态,LiveData将忽略该调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值