Android开发Viewbinding委托实例详解.docx
《Android开发Viewbinding委托实例详解.docx》由会员分享,可在线阅读,更多相关《Android开发Viewbinding委托实例详解.docx(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、I朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪I目录1 .背景2 .从Crash到有意思的源码1 .有趣的代码2 .另外一些有意思的地方3 .结尾二匕旦目乐前一阵子我们在使用viewbinding的委托的时候碰到了点crash问题,然后发现 了一个比拟有意思的解决方案,就和大家展开聊聊。另外一点就是我后面打算将kotlin extensions这个插件统一移除掉。估计大家应该对Viewbinding的委托应该都有一定的了解,好几个大佬提供过类 似的文章,但是大佬们的代码貌似也有一阵子都没有维护了,所以我找到了一个 外国大佬写的仓库,其实应该算是一个相对来说比拟稳定的库了,
2、而且也一直处 于一个持续更新迭代的状态。仓库地址 ViewBindingPropertyDelegate从Crash到有意思的源码委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处 理同一个请求,接受请求的对象将请求委托给另一个对象来处理。Kotlin直接支持委托模式,更加优雅,简洁。Kotlin通过关键字by实现委托。 上述是kotlin对于委托的释义,Viewbinding委托就是把生成Viewbinding实例 的过程交给委托类去完成,然后让使用方可以忽略掉其中的细节,是一种非常好 玩的模式了。但是由于Viewbinding的特殊性,它其实就会和当前的lifecycl
3、e绑定在一起。因 为我们要在销毁的情况下把实例重置为空。否那么当我们页面重新生成的情况下, 就会出现view并不是当前的页面的困扰。作者在定义的时候就将Viewbinding委托获取的实例定义为了非空,这里我和我 的同事其实是存在一些分歧的,我认为非空其实挺合理的,但是对方并不认为。 恰巧这种空非空的问题,在实际的使用中就出现了很多不可预期的crash问题。比方说在一个异步操作中获取viewbinding实例然后进行赋值操作,就会出现空 指针异常。另外由于使用的是lifecycle的页面销毁方法,如果我们复写了销毁方 法之后在设置这个值,也会出现崩溃问题。上述问题我在几个我之前参考的库中其实都
4、发现了对应的问题。我参考了 Binding,还有之前彭旭说的那个也有类似的情况。另外在fragment中,其实问题尤其的明显。因为我们很多时候使用的fragment 相关的LifecycleOwner是fragment本身,但是Android官方其实推荐我们使用 的是fragment内部的view相关的LifecycleOwner。因为fragment相比拟于 activity,存在的问题就是多了几个生命周期,比方createView,和 onDestroyVieWo其中出现最多问题的也就是onDestroyView和on Destroy o有趣的代码接下来我们看下这个作者是如何解决这些奇奇怪
5、怪的问题的哦。12 private class FragmentViewBindingProperty(45private val viewNeedlnitialization: Boolean,6viewBinder: (F) - T,8onViewDestroyed: (T) - Unit,9):LifecycleViewBindingProperty(viewBinder onViewDestroyed) 0private var fragmentLifecycleCallbacks:1FragmentManager.FragmentLifecycleCallbacks? = null1
6、private var fragmentManager: Reference? = null 21 /赋值操作3override fun getValue(thisRef: F, property: KProperty): T val viewBinding = super.getValue(thisRefJ property) registerFragmentLifecycleCallbacksIfNeeded(thisRef)16171819202122232425262728293031323334353637return viewBindingprivate fun registerF
7、ragmentLifecycleCallbacksIfNeeded(fragment: Fragment) if (fragmentLifecycleCallbacks != null) returnval fragmentManager = fragment.parentFragmentManager.also fm -this.fragmentManager = WeakReference(fm) )fragmentLifecycleCallbacks = ClearOnDestroy(fragment).also callbacks -fragmentManager.registerFr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 开发 Viewbinding 委托 实例 详解
限制150内