点赞重视,不再迷路,你的支撑对我含义严峻!
Hi,我是丑丑。本文 「Android 路途」| 导读 —— 从零到无穷大 已收录,这儿有 Android 进阶生长路途笔记 & 博客,欢迎跟着彭丑丑一同成面试技巧长。(联系方法在 GitHub)
前语
- ViewBinding 是 Android Gradle Plugin 3.6 中新增的特性,用于愈面试加轻量地完毕视图appear绑定(视图与变量的绑定),能够了解为轻量版其他 DataBinding;
- 在这篇文章里,我将总结 ViewBinding 运用办法 & 原理,假定能帮上忙,请必须点赞加重视,这面试毛遂自荐3分钟通用真的对我非常重要。
目录
前置知识
这篇文章的内容会触及以下前置 /面试技巧和留意事项 相关知识,交心的我都帮你预备好了,请享用~
- Kotlin | 托付机制 & 原理 & 运用
- Kotlin | 扩展函数(总算知道为什么 with 用 this,let 用 it)
- Java | 关于泛型能问的都在这儿了(含Kotlin)
- Android | Fragment 中心原理 & 面试题 (AndroidX 版别)实例化目标
1. 概述
-
ViewBinding 处理了什么问实例化目标的关键字题: ViewBinding 代替 findViewById,更高雅地完毕视图jvm调优交互;
-
ViewBinding 的完毕原理: Android Gradle 插件会为每个 XML 布局文件创立一个绑定apple类,绑定类中包括布局文件中每个界说了
android:id
特征的 Viewjvm废物收回机制 引用。假定布局文件为fragment_test.xml
,则生成绑定类FragmentTeappreciatestBinding.java
; -
悉数 XML 布局文件都生成 Java 类,会不会导致包体积瞬间增大? 未运用的类缓存视频会在混杂时被紧缩。
2. ViewBinding 与其他视图绑定计划比照
在 ViewJVMBinding 之前面试毛遂自荐,业界现已有过几种视图绑定计划了,想必你也用过。那么缓存视频变成本地视频,ViewBinding 作为后起之秀就必定比前者香吗,我带你分析下。
角度 | findViapplicationewById | ButterKnife | Kotli面试技巧和留意事项n Synthetics | DataBindingAPP | ViewBinding | ❓ |
---|---|---|---|---|---|---|
简练性 | ✖ | ✖ | ✔ | ✔ | ✔ | ❓ |
编译期检查 | ✖ | ✖ | ✖ | ✔ | ✔ | ❓ |
编译速度 | ✔ | ✖ | ✔ | ✖ | ✔ | ❓ |
支撑 Kotlin & Java | ✔ | ✔ | ✖ | ✔ | ✔ | ❓ |
收敛模板代码 | ✖ | ✖ | ✔ | ✖ | ✖ | ❓ |
-
简练性: findViewById 和 ButterKnife 需求在代码中声明appear许多变量,其他几种计划代码简练读较好;
-
编译检查: 编译期appointment间主要有两个方面的检查:类型检查 + 只能拜访当时布局中的 idappreciate。findViewById、JVMButterKni缓存视频fe缓存视频 和 Kotl面试问题大全及答案大全in Synthetics 在这方面表现较差;
-
编译速度: findViewById 的编译速度是最快的,而 ButterKnife 和 DataBinding 中存在注解处理,编译速度略逊色于 Kotlin Synthetics 和 ViewBinding;
-
支撑 Kotlin & Java: Kotlin Synthetics 只支撑 Kotlin 言语;
-
收敛模板代码: 基本上每种jvm原理计划都带有必定量application的模板代码,只有 Kotlin Synthetics 的模板代码是较少的。
能够看到,并没有一种绝对优势的办法,但越往后整体的作用是有进步的。其他,❓是什么呢?
3. ViewBinding 怎样用?
这一节咱们来介绍 Vi实例化目标是什么意思ewBinding 的运用办法,内容不多。
留意:ViewBinding 要求在 Android Gradle Plugin 版别在至少在 3.6 以上。
3.1 增加配备
视图绑定功用按模块等级启用,启用的模块需求在模块级 build.gralde 中增加配备。例如:
build.gradle
android {
...
viewBinding {
enabled = true
}
}
关于不需求生成绑面试毛遂自荐3分钟通用定类的布局文件,能够在根节点appreciate声明tools:viewBindingIgnorjvm内存结构e="true"
。例如:
<LinearLayout
...缓存视频怎样转入本地视频
tools缓存视频变成本地视频:v面试技巧iewBindi缓存的视频怎样保存到本地ngIgnore="true" >
...
<缓存的视频怎样保存到本地;/LinearLayout>
3.2 创立绑定类
有三个创立绑定类的 API:
fun <T> bind(view : View) : T
fun <T> i面试问题nflate(inflater : Layou缓存整理tInflater) : T
fun面试毛遂自荐范文 <T> inflate(inflater : LayoutInflater, parent : ViewGroup?, attachToParent : Boolean) : T
- 1、在 Activity 中运用
MainActivity.kt
class TestActivity: AppComJVMpatActivity(R.layout.面试毛遂自荐范文activity_test) {
private lateinit var bindappleing: ActivityTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityTestBinding.inflate(layoutInflater)
setContentVie缓存视频兼并app下载w(binding.ro面试问题大全及答案大全ot)
binding.tvDisplay.text = "Hello World."
}
}
- 2、在 Fragment 中运用
TestFragment.kt
class TestFragment : Fragment(R.layout.实例化类fragment_test) {
private var _binding: Fragmejvm原理及功能调优ntTestBinding? = null
private val binding get() = _binding!!
override fun onViewCreated(root: View, savedInstanceState: Bundle?) {
_binding =jvm废物收回机制 Fragment实例化类TestBindiappleng.bind(roo实例化需求t)
binding.tvDisplay.text = "Hello World."
}
override fun onDestroyView() {jvm原理
super.onDestroyView()
_binding = null
}
}
3.3 避免内存走漏
这儿有一个躲藏的内存走漏问题,你需求了解清楚(严格来说这并不是 ViewBinding实例化 的问题,即使你选用其它视图绑定计划也要实例化考虑这个问题)。
问题:为什么 Fragment#onDestroyView() 里需求置空绑定类方appreciate针,而 Activity 里不需求?
答:Activity 实例和 Activity 视图的生命周期是同步的,而 Fragment 实例和 Fragment 视图的生命周期并不是彻底同步的,因而需求在 Fragment 视图毁掉时,手动收回绑定类政策,否则构成内存走漏。例面试毛遂自荐3分钟通用如:detach Fragment,或许 remove Fragment 而且事务进入回来栈实例化一个类,此刻 Frag面试技巧ment 视图毁掉但 Fragmeappointmentnt 实例存在。关于 Fragment 生命周期和事务在我之前的一篇文章里讨论过:Android | Fragment 中心原理 & 面试题 (AndroidX 版别)
总之,在视图毁掉可是控制类政策实例还实例化是什么意思存活的机遇,你就需求手动收回绑定类政策,否则构成内存走漏。
3.4 ViewBinding 绑定类源码
反编译如下:
public final class ActivityTestBinding implements ViewBinding {
privaapplete final Const实例化需求raintLayout rootView;
public finaljvm优化 TextVie实例化是什么意思w tvDisplay;
pjvm调优rivate Actjvm废物收回算法ivityTestBinding (ConstraintLayout paramConstraintLayout1, TextView paramTextView)
t面试问题his.rootView = paramConstraintLayout缓存视频1;
this.tvDisplay = paramTextView;
}
public stat面试ic Activi面试问题tyTestBinding bind(Vi缓存的视频怎样保存到本地ew paramView) {
TextView localTextView = (TextView)paramView.findViewById(21311653appearance63);
if (localTextView != null) {
return new Activ实例化目标的关键字ityMainBinding((ConstraintLayout)paramView, localTextView);
}else {
paramView = "tvDisplay";
}
throw缓存 new NullPointerException("Missing required view with ID: ".concat(paramView));
}
public static ActivityMainBinding inflate(Layout实例化Inflappstoreater paramLayout面试Inflater) {
return inflate(paramLayoutInflater, null, false);
}
public static Actijvm内存模型vityMainBinding inflate(LayoutInflater par面试毛遂自荐3分钟通用amLayoutInflater, ViewGroup paramViewGroup, boolean paraapplicationmBo缓存整理olean) {
paramLayo缓存文件在哪里utInflaapproveter = paramLayoutInflater.inflate(2131361821, paramViewGroup, false);
if (paramBoolean) {
paramViewGroup.addappearanceViewapproach(paramLayo实例化utInflater);
}
return bind面试(paramLayoutInflater);jvm调优参数
}
public ConstraintLayout getRoot() {
return this.rootVappointmentiew;
}缓存视频
}
4. ViewBinding 与 Kotlin 托付双剑合璧
到这儿,ViewBinding 的运用教程现已说完了。可是回过头看,有没有发现一些局限性呢?
- 1、创立和收回 VieappearwBinding 政策需求重复jvm调优编写样板代码,特别是在 Fragment 中运用的案例;
- 2、binding 特实例化目标的关键字色是可空的,也是可变的,运用起来不方便。
那么,有没有可优化的计划呢?jvm调优咱们想起了 Kjvm废物收回算法otlin 特征托付,关于 Kotlin 托付机制在我之前的一篇文章里讨论过:Kotlin面试问题大全及答案大全 | 托付机制 & 原理。假定你还不appearance太了解 Kotlin 托付,下面的内容对你会有些难度。
下面,我将带你一步步封装 ViewBindingappreciate 特征托付东西:approach
4.1 ViewBinding + Kotlin 托付 1.0
首要,咱们拾掇一下咱们要托付的内容与需求,以及相应的处理办法:
需求 | 处理办法 |
---|---|
需求托付 ViewBinding#bind() 的调approve用 | 反射 |
需求托付 b实例化需求inding = null 的调用 | 监听 Fragment 视图生命周期 |
希望 binding 特征声明为非appearance空不行变变量 | ReadOnlyProperty<F, V> |
FragmentJVMViewBindingPropertyV1.kt
private consjvm废物收回算法t val TAG = "ViewBindingProperty"
public inl缓存视频ine fun <reified V : ViewBinding> viewBindingV1() = viewBindingV1(V::class.java)
public in实例化一个类line fun <reified Tapple : ViewBinding> viewBindingV1(clazz: Class<T>):实例化目标 Fragm缓存视频在手机哪里找entViewBindingPropertyV1<Fragment, T> {
val bindMethod = clazz实例化目标是什么意思.getMethod("bind",缓存视频变成本地视频 View::class.java)
ret面试urn FragmentViewBindingPropertyV1 {
bindMethod(null, it.requireView()) as T
}
}
/**
* @param viewBinder 创立绑定类政策
*/
class FragmentViewBindingPropertyV1<in F : Fragment, out V : VJVMiew面试问题大全及答案大全Binding>(
private val viewBinder: (F) -> V
) : ReadOnlyPropertyapprove<F, V> {
private var viewBinding: V? = null
@MainThread
override fun getValue(面试问题thisRef: F, propert缓存整理y: KPAPProperty<*>): V {
// 现已绑定,直接回来
viewBinding?.let { return it }
// Us面试常见问题及答复技巧e viewLifecycleOwner.lifecycjvm是什么意思le other than lifecycle
val lijvm调优参数fecycle = thisReAPPf.viewLifecycleOwne缓存整理r.lifecycle
valapple viewBinding = viewBinder(thisRef)
if (lifecycle.currentState == Lifecycle.State.DESTROYED) {
Log.w(
TAG, "Access to viewBindin实例化目标g after LJVMifecycle is destr面试毛遂自荐oyed or hasn't created yet.缓存文件在哪里 " +
"The instance of vi面试常见问题及答复技巧ewBinding willjvm原理及功能调优 be not ca缓存整理ched."
)
// We can access t缓存的视频怎样保存到本地o ViewBinding after Fragment.onDestroyView(), but don't save it to prevent memory leak
} else {
lifecycle.addObserver(ClearOnDestroyLifecycleObserver())
this.viewBinding = viewBinding
}
return viewBinding
}
@MainThread
fun clear() {
viewBinAPPding = null
}
p缓存视频在手机哪里找rivate inner class ClearOnDestroyLifecycleObserver : LifecycleObserver {
private val mainHandler = Han缓存视频变成本地视频dler(Looper.getMainLooper())
@M缓存的视频怎样保存到本地ainThread
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun面试问题 onDestroy(owner: LifecycleOwner) {appear
owner.lifecycle.removeObserver(this)
mainHandler.post { clear() }
}
}
}
运用办法:
class TestFragment : Frag面试问题大全及答案大全ment(R.layout.fragment_test) {
private val binding : FragmentTestB缓存视频怎样转入本地视频inding by viewBi面试技巧ndingV1()
override fun onViewCreated(root: View, savedInstanceState: Bundle?) {
binding.tvDisplay.te缓存整理xt = "Hello World."
}
}
洁净新鲜!前面提出的三个需求也都完毕了,现在我为你缓存视频变成本地视频答复细节:
-
问面试毛遂自荐3分钟通用题 1、为什么能够运用 V::class.java,不是泛型擦除了吗? 利用了 Kotlin 内敛函数 + 实化类面试型参数,编译后函数体整体被复制到调用处,V::c实例化lass.java 其实是 FragmentTe缓存stBinding::class.缓存视频java。详细分析见:Java | 关于泛型能问的都在这儿了(面试含Kotlin)
-
问题 2、ReadOnlyProperty<F, V> 是什么? ReadOnlyProperty 是不行变特征署理,缓存的视频怎样保存到本地通过 getValue(…) 办法完毕托付行为。第一个类型参数 Fjvm内存结构 是特征悉数者,第二个参数 V 是特征类型,因为咱们在 Fragment 中界说特征,特征类型为 ViewBinding,所谓界说类型参数为 <in F : Fragment, out V : ViewBinding>;
-
问题 3、解说下 getValue(…) 办法? 直application接看注释:
@MainThread
override fun get实例化一个类Value(实例化一个类thisRef: F, property: KProperty<*>): V {
1、viewBinding 不为空阐明现已绑定,直接回来
viewBinding?.let { return it }
2、Fragment 视图的生命周期
val lifecjvm废物收回算法ycle = thisRef.viewLifecycleOwner.lifecycle
3、实例化绑定类政策
val viewBindinappleg = viewBind实例化目标有几种方法er(thisRef)
if (lifecycle.currentSta实例化目标是什么意思te == Lifecycle.State.DESTROapplicationYED) {
4.1jvm原理及功能调优 假定视图生命周期为 DESTROYED,阐明视图被毁掉,此刻不缓存绑定类政策(避免内存走漏)
} elseapprove {
4.2 界说视图生命周期监听者
lifecycle.addObserver(ClearOnDAPPestroyLifecycleObserver())
4.3 缓存绑定类政策
this.viewBinding =缓存视频变成本地视频 viewBinding
}
return viewBinding
}
- 为什么 onDestroy() 要选用 Handler#post(Message) 完毕? 因为 Fragment#viewLifecycl面试毛遂自荐一分钟eOw实例化目标ner 告诉生命周期事情 ON_DESTROY 的机遇在 F面试毛遂自荐简略大方ragment#onDestryoView 之前。
4.2 ViewBinding + Kotlin 托付 2.0
1.0 版别运用了反射,真的必定要反射吗?反射调用 bind 函数jvm是什么意思的目的便是获得一个 ViewBinding 绑定类政策appointment,或许咱们能够试试把创立政策的行为交实例化数组给外部去界说,相似这样:
inline fun <F : Fragment, V : ViewBinding> viewBindingV2(
crossinline viewBinder: (View) -> V,
cjvm原理rossinline viewProvider: (F) -> View = Fragment::requirappstoreeView
) = FragmentappreciateViewBindingPjvm废物收回机制ropertyV2 { fragment: F ->
vijvm内存结构ewBinder(viewProvider(fra缓存gment))实例化需求
}
class FragmentViewBindingPropertyV2<in F : Fragment, out V面试毛遂自荐范文 :实例化目标的关键字 ViewBi缓存视频怎样转入本地视频nding>(
private val viewBinder: (F) -> V
) : Read面试毛遂自荐3分钟通用OnlyProperty<F, V> {
相同 ...
}
运用办法:
class TestFragment : Fragappearancement(R.layout.fragment_test) {
private val binding b实例化y viewBindingV2(Frag面试问题mentTestBinding::bind)
override fun onViewCreated(root: View, s缓存视频在手机哪里找avedInstanceSta实例化数组te: Bundle?) {
binding.tvDispl实例化数组ay.text = "Hello World."
}
}
洁净新鲜!不运用反射也能够完毕,现在我为你答复细节:
-
问题 4、(View) -> V 是什么? Kotlin 高阶函数,能够把 lambda 表达式直接作为参数传递,其间 View 是函数参数,而 T 是函数回来值。lambda 表达式本质上是 「能够作为值传递的代码块」。在老版别 Java 中,传递代码块需求运用匿名内部类完毕,而运用 甚至连函数声明都不需求,能够直接传递代码块作为函数值;
-
问题 5、Fragment::requireView 是什么? 把函数 requireView() 作为appearance参数传递。Fragment#requireView() 回来 Fragment 根视图,在 onCreateView() 之前调用 requireView() 会抛出失常;
-
问题 6、Fragmen缓存视频兼并app下载tTes缓存视频变成本地视频tBinding::bind 是什么? 把函数 b缓存视频怎样转入本地视频ind() 作为参数传递,bind实例化是什么意思 函数的参数为 View,回来实例化目标值为 ViewBinding,与函数声明 (View) -> V 匹配。
4.3JVM ViewB缓存视频怎样转入相册inding + Kotlin 托付 最终版
2.APP0 版别现已完毕了针对 Fragm缓存视频怎样转入相册ent 的特征署理,可是实践场景中只会在 Fragment 中运appstore用 ViewBinding 吗?显着并不是,咱们还有其他一些场景面试毛遂自荐简略大方:
- Activity
- Fragment
- DialogFragment
- ViewGroup
- Recyclejvm废物收回机制rView.VieAPPwHolder
所以,咱们有必要将托付东西适当封装得更通用些,无缺代码和演示工程你能够直接下载检查:下载途径,这儿只展示部分中心代码如下:
@JvmName("viewBindingActivity")
inline fun <A : ComponentActiappstorevity, V : ViewBinding&面试毛遂自荐简略大方gt; vie面试毛遂自荐范文wBinding(
crossinlapplicationine viewBinder: (View) -> V,
crossinline viewProvider: (A) -> VAPPiew = ::findRootViewjvm调优
): ViewBindingProperty<A, V> = ActivityViewBindingProperty { activity: A ->
viewBinder(viewP面试毛遂自荐3分钟通用rovider(实例化需求activity))
}
@JvmName("vie实例化类wBinJVMdingActivity")
inline fun <A : ComponentActivity, V : ViewBinding> viewBinding(
crossinline viewBinder: (View) -> V,
@IdRes viewBindingRootId: Int
): ViewBindingProperty<A, V> = ActivityViewBindijvm原理n面试gProperty { activity: A ->
viewBindejvm是什么意思r(activity.requireViewByIdCompat(viewBindingRootId))
}
// ------------------------jvm废物收回机制--------jvm废物收回机制-----------------------------------------------------
// ViewBindingProperty for Fjvm废物收回机制ragment
// ---------------------------------面试技巧----------------------------------------------------
@Sup面试常见问题及答复技巧press("UNCHECKED_CAST")
@JvmName("viewBindingFragment")
inline fun <F : Fragment, V : ViewBinding> Fr实例化目标是什么意思agment.viewB缓存视频在手机哪里找inding(
crossinline viewBinder: (View) -> V,
crossinlin实例化目标e viewProvider: (F缓存视频兼并app下载) -> View = Fragment::requireView
): ViewBindingP缓存整理roperty<F, V> = when (this) {
is Di实例化数组alogFragment -> DialogFragmentViewBindingProperty { fragmentapple: F ->
viewBinder(viewProvider(fragment缓存文件在哪里))
} as ViewBindappleingProperty<F, V>
else -> FragmentV实例化目标有几种方法iewBindingProperty { fragment: F ->
viewBinder(viewProvider(frajvm是什么意思gment))
}
}
@Suppress("UNCHECKED_CAST")
@Jv缓存视频兼并mName("vie缓存视频变成本地视频wBindingFragment")
inline fun <F : F实例化一个类ragment, V : ViewBinding&g缓存视频怎样转入相册t;jvm优化 Fragmen面试毛遂自荐范文t.viewBinding(
cross面试毛遂自荐3分钟通用inline viewBinder: (View) -> V,
@IdRes viewBindingRootId: Int
): ViewBindingProperty<F, V> = when (this) {
is DialogFragment -> viewBinding(viewBinder) { fragment: DialogFragment ->
fragment.getRootView(viewBindingRootId)
} as ViewBindingProperty<F, V>
else -> viewBinding(viewBinder) { fragment: F ->
fragment.requireView().requireViewByIdCompat(viewBindingRootId)
}
}
// ----------------------------面试毛遂自荐简略大方---------------------------APP--实例化是什么意思-------实例化数组---------------------
// ViewBindingProperty
// -------------------------------------------------------------------------------------
private const val TAG = "ViewBindingProperty"
interface ViewBindingProperty<in R : Any, out V : V缓存视频iewBinding> : ReadOnlyProperty<缓存视频兼并;缓存的视频怎样保存到本地R, V> {
@MainThread
fun clear()
}
abstract class LifecycleViewBindingProperty缓存文件在哪里<in R : An实例化目标有几种方法y, out V : Viejvm调优参数wBinding>(
priv缓存视频在手机哪里找ate val viewBinder: (R) -> V
) : ViewBindingProperty<R, V> {
private var viewBind实例化目标ing: V? = null
protected abstract fun getLifecycle面试技巧Owner(thisRef: R): LifecycleOwner
@MainThre实例化数组ad
override fun getVappearancealue(thisRef: Rjvm内存模型, property: KProperty<*>): V {
// Already bound
viewBinding?.let { return it }
val lifecycle = getLifecycleOwner(thisRef).lifecycle
val viewBijvm优化nding = viewBappstoreinder(thisRef)
if (lifecy缓存cle.currentStateapple == Lifecycle.State.DESTROYED) {
Log.w(
TAG, "Access to viewBinding after Lifecycle is destroyed or haapproachsn'V created yet. " +
"The instance of viewBinding will be not cached."
)
// We can access to ViewBindjvm是什么意思ing after Fragment.onDestroyappointmentView(), but don'V sav实例化目标有几种方法e it to prevent m缓存视频怎样转入相册emory leak
} else {
lifecycle.addObserver(Cleapp安装下载arOnDestroyLifecycleObserver(this))
thijvm原理s.viewBinding = viewBinding
}
return viewBinding
}
@MainThread
override fun clear() {
viewBinding = null
}
private class Clear面试毛遂自荐一分钟OnDestroyLifecycleObsapproveerver(
private val property: LifecycleViewBindingProperty<*, *>实例化servlet类反常
) : LifecycleObserver {
private companion object {
private val mainHandler = Handler(Looper.getMainLooper面试技巧和留意事项())
}
@MainThread
@OnLifecycleEvent(Lifecycle.Event.ON_DAPPESTROY)
fun onDestroy(owner: LifecycleOwner) {
mainHandler.post { property.clear() }
}
}
}
class FragmentViewBindingProperty<in F : Fragment, out V : ViewBinAPPding>缓存视频兼并app下载(
viewBinder: (F) -> V
) : Li缓存视频在手机哪里找fecycleViewBindingPrope实例化目标是什么意思rty<F, V>(viewBinder) {
override fun getLifecycleOwner(thisjvm原理Ref:缓存 Fappointment): LifecycleOwner {
try {
return thisRef.viewLifecycle缓存视频Owner
} catch (appstoreignored: IllegalStateException) {
error("Fragment面试常见问题及答复技巧 doesn't have view associated with it or the view has been destroyed")
}
}
}
class DialogFragmentViewBindingProp实例化servlet类反常ertyjvm优化<in F : DialogFappleragment, out V : V面试问题iewBinding>(
viewBinder: (F) -> VJVM
) : LifecycleViewBindingProperty<F, V>(viewBinder) {
override fun getLifecycleOwner(thisjvm废物收回算法Ref: F): LifecycleOwner {
return if (thisRef.showsDialog) {
thisRef
} else {
try {
thisRef.viewLi实例化数组fecycleOwner
} catch (ignored: IllegalStateException) {
error("Fragment d实例化目标oesn't have view associated with it or the view has been destroyed")
}
}
}
}
5. 总结
ViewBinding 是一个轻量级的视图绑定计划,Android Gradle 插件会为每个 XML 布局文件创立一个绑定类。在 Fragment 中运用 ViewBinding 需求留意在 Fragment#onDestroyView() 里置空绑定类政策避免内存走漏。但这会带来许多重复编写样板代码,运用特征托付能够收敛模板代码,确保调用方代码洁净新鲜。
角度 | findViewById | ButterKnife | Kotlin Synthetics | Dat面试常见问题及答复技巧aB面试常见问题及答复技巧inding | ViewBjvm内存结构inding实例化目标 | ViewBindingProperty |
---|---|---|---|---|---|---|
简练性 | ✖ | ✖ | ✔ | ✔ | ✔ | ✔ |
编译期检查 | ✖ | ✖缓存文件在哪里 | ✖ | ✔ | ✔ | ✔ |
编译速度 | ✔ | ✖ | ✔ | ✖ | ✔ | ✔缓存视频怎样转入相册 |
支撑 Kotlin & Java | ✔ | ✔ | ✖ | ✔ | ✔ | ✔ |
收敛模板代码 | ✖ | ✖ | ✔ | ✖ | ✖ | ✔ |
参考资料
- View Binding 视图绑定 —— 官方文档
- Viewjvm是什么意思 Binding 与 Kotlin 托付特征的奇妙结合,告别废物代码! —— Kirill Rozov 著,依然范特稀西 译
- 谁才是 ButterKnife 的终结者? —— fundroid 著
创造不易,jvm原理你的「三连」是丑丑最大的动力,咱们下次见!