解决liveData 订阅的黏性问题

/**
 * 解决liveData 订阅的黏性问题
 * @param <T>
 */
public class NonStickyMutableLiveData <T> extends MutableLiveData {

    private boolean stickFlag = false;

    @Override
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
        super.observe(owner, observer);

        if (!stickFlag){
            hook(observer);
        }
    }

    private void hook(Observer<? super T> observer){
//        1. 得到mLastVersion
//        获取listdata 中的mObservers 对象

        try {
            Class<LiveData> liveDataClass = LiveData.class;
            Field mObserverField = liveDataClass.getDeclaredField("mObservers");
            mObserverField.setAccessible(true);
//            获取到这个成员变量的对象
            Object mObserverObject = mObserverField.get(this);
//            得到map 对应的class 对象
            Class<?> mObserverClass = mObserverObject.getClass();
//            获取到mObserver 对应的get方法
            Method get = mObserverClass.getDeclaredMethod("get", Object.class);
            get.setAccessible(true);
//            执行get 方法
            Object invokeEntry = get.invoke(mObserverObject, observer);
//            定义一个空的对象
            Object observerWraper = null;
            if (invokeEntry != null && invokeEntry instanceof Map.Entry){
                observerWraper = ((Map.Entry) invokeEntry).getKey();
            }
            if (observerWraper == null){
                throw new NullPointerException("observerWraper is null");
            }
//            得到observerWraper的类对象 编译擦除问题会引起多态冲突所以用getSuperClass
            Class<?> superClass = observerWraper.getClass().getSuperclass();
            Field mLastVersion = superClass.getDeclaredField("mLastVersion");
            mLastVersion.setAccessible(true);
//            2. 得到mVersion
            Field mVersion = liveDataClass.getDeclaredField("mVersion");
            mLastVersion.setAccessible(true);
//            3.把mVersion的数据填入到LastVersion中
            Object mVersionValue = mVersion.get(this);
            mLastVersion.set(observerWraper, mVersionValue);

            stickFlag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
LiveData 是用于在 Android 应用程序中观察数据的一个组件。LiveData 是一个可观察的数据持有者类,它具有生命周期感知能力,因此它会自动管理它与 Activity 和 Fragment 生命周期的关系,从而可以避免内存泄漏和崩溃。 LiveData 的一个重要特性是它可以通知观察者数据已更改。当 LiveData 的值发生更改时,它会自动通知所有观察者。这意味着您无需手动更新 UI 或执行其他操作以反映数据更改。LiveData 还支持数据转换和过滤,因此您可以将原始数据转换为 UI 可以直接使用的格式。 LiveData 使用观察者模式进行数据监听,您可以使用 `observe()` 方法将观察者添加到 LiveData 实例中,该方法需要传入一个 LifecycleOwner 和一个 Observer 对象。LifecycleOwner 表示 LiveData 与哪个组件的生命周期绑定,通常是 Activity 或 Fragment。Observer 对象定义了当 LiveData 的值更改时要执行的操作。 下面是一个简单的示例,演示如何使用 LiveData 监听数据更改: ``` // 创建一个 LiveData 实例 val myLiveData = MutableLiveData<String>() // 将观察者添加到 LiveData 实例中 myLiveData.observe(this, Observer { newValue -> // 在这里更新 UI 或执行其他操作 textView.text = newValue }) // 更改 LiveData 的值 myLiveData.value = "Hello World" ``` 在上面的示例中,我们创建了一个名为 `myLiveData` 的 LiveData 实例,并将其与当前组件的生命周期绑定。我们还将一个 Observer 对象传递给 `observe()` 方法,以便在 LiveData 的值更改时执行操作。当我们调用 `myLiveData.value = "Hello World"` 时,LiveData 会自动通知所有观察者,以便更新 UI 或执行其他操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半身风雪

感谢打赏,你的鼓励,是我创作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值