美文网首页
LiveData去除粘性事件

LiveData去除粘性事件

作者: 剧透下 | 来源:发表于2022-12-12 15:19 被阅读0次

class UnPeekLiveData : MutableLiveData() {

override fun observe(owner: LifecycleOwner, observer: Observer) {

super.observe(owner, observer)

hook(observer)

}

private fun hook(observer: Observer) {

val liveDataClass = LiveData::class.java

        try {

//获取field private SafeIterableMap, ObserverWrapper> mObservers

            val mObservers = liveDataClass.getDeclaredField("mObservers")

mObservers.isAccessible =true

            //获取SafeIterableMap集合mObservers

            val observers = mObservers[this]

val observersClass: Class<*> = observers.javaClass

            //获取SafeIterableMap的get(Object obj)方法

            val methodGet = observersClass.getDeclaredMethod("get", Any::class.java)

methodGet.isAccessible =true

            //获取到observer在集合中对应的ObserverWrapper对象

            val objectWrapperEntry = methodGet.invoke(observers, observer)

var objectWrapper: Any? =null

            if (objectWrapperEntryis Map.Entry<*, *>) {

objectWrapper =objectWrapperEntry.value

            }

if (objectWrapper ==null) {

throw NullPointerException("ObserverWrapper can not be null")

}

//获取ObserverWrapper的Class对象  LifecycleBoundObserver extends ObserverWrapper

            val wrapperClass: Class<*>? =objectWrapper.javaClass.superclass

            //获取ObserverWrapper的field mLastVersion

            val mLastVersion = wrapperClass!!.getDeclaredField("mLastVersion")

mLastVersion.isAccessible =true

            //获取liveData的field mVersion

            val mVersion = liveDataClass.getDeclaredField("mVersion")

mVersion.isAccessible =true

            val mV = mVersion[this]

//把当前ListData的mVersion赋值给 ObserverWrapper的field mLastVersion

            mLastVersion[objectWrapper] = mV

mObservers.isAccessible =false

            methodGet.isAccessible =false

            mLastVersion.isAccessible =false

            mVersion.isAccessible =false

        }catch (e: Exception) {

e.printStackTrace()

}

}

}

相关文章

网友评论

      本文标题:LiveData去除粘性事件

      本文链接:https://www.haomeiwen.com/subject/rmqcqdtx.html