本文链接:https://blog.csdn.net/feather_wch/article/details/131797422
1、LiveData不能在子线程putValue,只能postValue
object MyLiveData {
val data:MutableLiveData by lazy { MutableLiveData() }
init {
data.value = "default" // 该单例第一次在子线程中使用,会触发初始化,putValue()会闪退
// 另一个进程的Service中thread{}中去使用,会出现问题
}
}
2、后观察数据是什么效果?为什么可以收到之前的数据?
3、怎么修改数据粘性?
4、LiveData简单使用
val data = MutableLiveData()
data.value = "Hello LiveData"
data.observe(this, Observer { value ->
// 在这里处理数据更新的逻辑
println(value)
})
5、在 ViewModel 中使用 LiveData:
class MyViewModel : ViewModel() {
private val _data = MutableLiveData()
val data: LiveData get() = _data // 将其转换为不可变的 LiveData 对象 `data`
fun fetchData() {
// 模拟从网络或数据库获取数据
val newData = "New Data"
_data.value = newData // Activity 或 Fragment 可以通过观察 `data` 来接收数据的更新。
}
}
6、使用 Transformations.map 转换 LiveData:Int->String
// 转换:添加内容返回新的LiveData对象
val data: LiveData = Transformations.map(sourceData) { input ->
"Transformed: $input"
}
7、数据排序:当你从数据库或网络获取到未排序的数据列表时,你可以使用 Transformations.map 来将其排序成一个有序的列表:
val unsortedListLiveData: LiveData<List> = ...
val sortedListLiveData: LiveData<List> = Transformations.map(unsortedListLiveData) { unsortedList ->
unsortedList.sorted()
}
、数据过滤:当你需要根据特定条件筛选出符合条件的数据时,你可以使用 Transformations.map 来进行数据过滤:
val originalLiveData: LiveData<List> = ...
val filteredLiveData: LiveData<List> = Transformations.map(originalLiveData) { originalList ->
originalList.filter { it.startsWith("A") } // 只保留以字母 "A" 开头的元素
}
1、LiveData:
2、MutableLiveData:
3、MediatorLiveData:
4、Transformations:
5、Observer:
6、LifecycleOwner:LifecycleOwner 是一个接口,表示具有生命周期感知能力的组件,如 Activity、Fragment。LiveData 可以感知 LifecycleOwner 的生命周期,自动管理观察者的注册和注销。
7、SAM单个抽象方法,类似有Runnable
public interface Observer {
void onChanged(T t);
}
8、LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver
onActive()
告诉外界活动中onInactive()
告诉外界非活动1、注册监听流程
MutableLiveData("String").observe(this){it}
#LiveData
observe(LifecycleOwner owner, Observer observer)
->assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) return; // 1. 销毁,无反应,避免内存泄漏
->LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);// 2. 包装成真正的观察者,去感知Lifecycle
->ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); // 3. SafeIterableMap,线程安全Map,不存在添加,存在则取出
->owner.getLifecycle().addObserver(wrapper); // 4. 注册监听,生命周期
2、感知Lifecycle生命周期
LifecycleBoundObserver.onStateChanged() 会感受到生命周期变化
->DESTROYED => removeObserver(mObserver);
->activeStateChanged(shouldBeActive());
->dispatchingValue(ObserverWrapper)
->for()遍历
->considerNotify()
->if (observer.mLastVersion >= mVersion) return; // 粘性事件
->observer.mObserver.onChanged((T) mData); // 传输数据给观察者
3、事件分发:postValue、setValue
#LiveData
->assertMainThread("setValue");
->mVersion++; // 发一次事件,版本号+1
->mData = value;
->dispatchingValue(null);
->for()遍历
->considerNotify()
->if (observer.mLastVersion >= mVersion) return; // 粘性事件
->observer.mObserver.onChanged((T) mData); // 传输数据给观察者
4、observer.mLastVersion和mVersion
mVersion
:每次数据更新时++observer.mLastVersion
表示上次观察者接收到的版本号。// = mVersionobserver.mLastVersion >= mVersion
:观察者已经接收过相同版本的数据,直接返回,避免重复处理相同的数据。5、为什么会有粘性事件
6、如何解决粘性事件
7、什么是数据倒灌?本质就是粘性事件,新造了名词。
1、LiveData在多线程中是如何处理的?
2、为什么要有MutableLiveData而不是直接使用LiveData?体现了什么原则?
1、LiveData的模板方法模式:onActive、onInactive
2、外观模式:MutableLiveData隐藏了LiveData内部的复杂子系统,注册监听、生命周期感知、事件分发
自己实现KT版本LiveDataBusKt