fun updateTaps() {
_userLiveData.postValue(User(“aa”, “bb”, 12))
}
}
switchMap()
对存储在LiveData
对象中的值应用函数
//HomeViewModel.kt
class HomeViewModel : ViewModel() {
private val _userIdLiveData = MutableLiveData()
val user: LiveData = Transformations.switchMap(_userIdLiveData) { userId ->
Repository.getUser(userId)
}
fun updateTaps() {
_userIdLiveData.postValue(“cc”)
}
}
// 测试
object Repository {
fun getUser(userId: String): LiveData {
val liveData = MutableLiveData()
liveData.value = User(userId, userId, 0)
return liveData
}
}
[](()合并多个 LiveData 源
MediatorLiveData
允许合并多个 LiveData 源,适用于一个观察者,多个被观察者
//HomeViewModel.kt
class HomeViewModel : ViewModel() {
private val _user1 = MutableLiveData()
private val _user2 = MutableLiveData()
var mediatorLiveData: MediatorLiveData = MediatorLiveData()
init {
mediatorLiveData.addSource(_user1) {
mediatorLiveData.value = it
}
mediatorLiveData.addSource(_user2) {
mediatorLiveData.value = it
}
}
fun updateTaps() {
_user1.postValue(User(“ll”, “nn”, 12))
_user2.postValue(User(“xx”, “bb”, 12))
}
}
// HomeFragment.kt
…
private fun subscribeUI() {
observe(viewModel.mediatorLiveData, ::mediatorLiveDataUpdate)
}
private fun mediatorLiveDataUpdate(user: User?) {
Log.e(“==========”,“$user”)
}
[](()相关知识点
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】
知识点一:
postValue
和setValue
setValue
需要运行在主线程,postValue
不用
protected void postValue(T value) {
boolean postTask;
synchronized (mDataLock) {
postTask = mPendingData == NOT_SET;
mPendingData = value;
}
if (!postTask) {
return;
}
ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}
@MainThread
protected void setValue(T value) {
assertMainThread(“setValue”);
mVersion++;
mData = value;
dispatchingValue(null);
}
如果想进阶学习jetpack又缺少学习资料,而我正好薅到这本阿里十年技术专家联合打造“最新”《Jetpack架构组件入门到精通》和《Jetpack强化实战手册》,是你学习Jetpack的葵花宝典。
[](()[点击此处蓝字免费获取](()
[](()《Jetpack强化实战手册》
[](()一、初识ConstraintLayout之实现登录页面
1.创建项目
2.沉浸式的布局
3.富文本
4.属性动画
[](()二、Navigation实践之实现APP主框架以及Navigation的相关介绍
1.搭建 Bottom Navigation Activity
2.导航界面跳转
3.Navigation传值
4.Navigation跳转动画
5.导航文件拆分
6.Deeplink导航
[](()三、使用 Coroutines, Retrofit, Moshi实现网络数据请求
1.kotlin - Coroutine 协程
2.用协程和Retrofit实现网络请求
[](()四、使用 TabLayout,ViewPager2 ,RecyclerView实现实现歌单广场页面
1.ViewPager2
2.TabLayout
3.RecyclerView
4.网络数据请求和数据填充
5.优化界面
[](()五、歌单页面MVVM架构改造及其ViewModel和LiveData的使用介绍
1.MVC和MVVM介绍
2.修改歌单页面
[](()六、Paging实现加载更多和下拉刷新,错误后重新请求
1.Paging的优势
2.Paging实现分页加载更多
3.Paging和SwipRefreshLayout组合实现下拉刷新
4.给RecyclerView添加加载状态的Footer
5.发生网络错误后重试
6.帧动画
[](()七、vlayout嵌套横向RecyclerView和Banner 实现主页的展示,自定义Moshi的JsonAdapter
1.vlayout架构分析
2.vlayout布局介绍
3.基础工作准备
4.vlayout实现轮播图
5.字段内容类型不一致
[](()八、Room数据库实现增删改查和事务处理
1.添加Room依赖
2.Room详细介绍
3.DataBase创建时插入数据
4.Room实现歌单标签编辑界面的增删改查
[](()九、Room数据库Migration
1.新建 Entity
2.新建 Dao
3.修改 Database
4.修改 HomeViewModel
5.Migration
[](()十、ExoPlayer进行视频播放的实现
1.ExoPlayer介绍
2.ExoPlayer简单的使用方法
3.ExoPlayer简单自定义
4.ExoPlayer高级自定义
5.ExoPlayer在RecyclerView中的复用
[](()十一、MotionLayout让动画如此简单
1.MotionLayout基础
2.关键帧 Keyframes
3.代码启动动画和监听动画
4.MotionLayout案例分析
[](()十二、Kotlin Flow基础知识详解
1.Flow 引入的场景
2.Flow 的特性
3.Flow的构造函数
4.Flow中间运算函数
5.Flow结束函数
6.Flow的错误异常处理