我是一名Android开发,目前就职于字节跳动。我毕业来到深圳已经8年多;转行从事Android开发也已5年多。 2021是我年龄上一个重要节点,我二十多岁的青春,用完了。 ...
我是一名Android开发,目前就职于字节跳动。我毕业来到深圳已经8年多;转行从事Android开发也已5年多。 2021是我年龄上一个重要节点,我二十多岁的青春,用完了。 ...
作者你好,看完后有点疑问,如果按上面的例子来看,数据的储存和生命周期的对应都可以由LiveData单独实现了吧,自己封装一个类来管理liveData也可以的吧,这里用ViewModel的优势在哪里呢?
“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!Jetpack AAC 系列文章:“终于懂了“系列:Jetpack AAC完整解析(一)Lifecycle 完全掌握![https://www.jianshu.com/p/7...
整个指纹密码流程下来,你添加的密钥起到了什么作用呢
Android开发 多语言、指纹登录、手势登录简介 随着互联网的发展不光手机配置越来越高,app产品要求也越来越高了。现在做APP时产品都会让我们加上 多语言、指纹登录、手势登录等功能。下面代码完全适配Android8....
Github 链接 Collie [https://github.com/happylishang/Collie] App性能如何量化 如何衡量一个APP性能好坏?直观感受...
很早之前就想深入的研究和学习一下热修复,由于时间的原因一直拖着,现在才执笔弄起来。 Android而更新系列:Android热更新一:JAVA的类加载机制Android热更新...
系列文章 【背上Jetpack】Jetpack 主要组件的依赖及传递关系【背上Jetpack】AdroidX下使用Activity和Fragment的变化【背上Jetpack...
在说起Jetpack的ViewModel时,我们第一反应都会想到它就是MVVM中的VM。然而这两者并不是等价关系,Jetpack的ViewModel它只是官方为我们提供的一个...
前言 最近几天把Jetpack中的3剑客Lifecycle+ViewModel+LiveData的使用和原理学习了一遍,这3者也是构建MVVM模式的核心。这个系列的工具,建议...
目前关于LiveData源码解读的文章非常多了,本文就不重复了,这里只对核心流程做解读。关于源码流程,推荐:Android livedata 源码解剖 系列文章 Androi...
感觉你说的“内存泄漏的本质是什么?”下面的内容确实有点问题。
LiveData.observe(owner,ovserver){
......
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);//1
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);//2
......
owner.getLifecycle().addObserver(wrapper);//3
}
上面两行确实决定了Activity/Fragment与LiveData.LifecycleBoundObserver的相互引用,(注释1)决定了LiveData.LifecycleBoundObserver引用到Activity/Fragment,(注释3)决定Activity/Fragment引用LiveData.LifecycleBoundObserver。
但是LiveData.LifecycleBoundObserver的detachObserver()方法的实现为:
LiveData.LifecycleBoundObserver.detachObserver() {
mOwner.getLifecycle().removeObserver(this);
}
它与上面注释2对应,仅仅是让Activity/Fragment不再引用LiveData.LifecycleBoundObserver。其实这里虽然LiveData.LifecycleBoundObserver保持着Activity/Fragment的引用,但是如果LiveData.LifecycleBoundObserver没有被其他对象引用上,也就不能被GCRoot给链接上,则不会影响它的回收。
同时(注释2)处使得LiveData引用到了LiveData.LifecycleBoundObserver,于是就有了LiveData->LiveData.LifecycleBoundObserver->Activity/Fragment,这才是可能导致内存泄漏的关键点。
那是什么时候断掉这条引用链的呢?
LiveData.LifecycleBoundObserver.onStateChanged(source, event) {
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
}
LiveData.LifecycleBoundObserver在监听到Activity/Fragment DESTROYED的时候调用了LiveData.removeObserver(mObserver)。
LiveData.removeObserver(mObserver){
......
ObserverWrapper removed = mObservers.remove(observer);
......
}
在这里LiveData直接断掉了对LiveData.LifecycleBoundObserver的引用。LiveData-/->LiveData.LifecycleBoundObserver->Activity/Fragment
到此为止LiveData.LifecycleBoundObserver->Activity/Fragment的引用关系其实一直还存在的,但是LiveData.LifecycleBoundObserver已经是一个孤立对象,所以不影响它的回收。
Android Jetpack LiveData解析目前关于LiveData源码解读的文章非常多了,本文就不重复了,这里只对核心流程做解读。关于源码流程,推荐:Android livedata 源码解剖 系列文章 Androi...
**Data Binding**顾名思义就是数据绑定,2015年谷歌I/O大会上发布了DataBinding,它是一个数据绑定框架,是一种对MVVM的实现,MVVM模式就相当...
昨天发了一片文章《Android近期面试总结》,其实这篇文章主要还是对于自己前一段时间所做的事情的总结。对大家的价值并不是很大。而有一位将要实习的同学讲“先收藏,到时候再来看...
注:本文章只代表个人观点。 最近一段时间聊了一些候选人。发现大多数的候选人都是被一些低级又致命的失误PASS掉的。今天整理一些,希望各位同学在这金三银四的时间段,不要因为这些...