Kotlin 委派(ReadWriteProperty) 实现Activity/Fragment 的成员变量自动内存回收

阅读: 评论:0

Kotlin 委派(ReadWriteProperty) 实现Activity/Fragment 的成员变量自动内存回收

Kotlin 委派(ReadWriteProperty) 实现Activity/Fragment 的成员变量自动内存回收

通过委派机制和方法的扩展实现一个Activity/Fragment 的成员变量自动内存回收

1.虽然JVM 有GC,会帮助我们回收对象。但是有时候需要我们手动回收对象,特别Android,处理内存泄漏等问题。

//一般手动处理
class MainActivity : AppCompatActivity() {var data: Any? = nulloverride fun onCreate(savedInstanceState: Bundle?) {Create(savedInstanceState)setContentView(R.layout.activity_main)data = ...}override fun onDestroy() {Destroy()//页面销毁了,手动把变量设置为null,断开对象的引用data = null}
}
  1. 先看下怎么用的,通过autoCleans委派的对象,在DemoActivity的生命周期onDestroy的时候会把对象设置为null,断开引用,不需要手动设置null
// Activity::kt
class DemoActivity: AppCompatActivity(R.layout.activity_demo) {// val 修饰 不可变, 只能初始化赋值private val name by autoCleans("xiaoli")//同上,区别在于,可以做一些自定义的操作private val name2 by autoCleans { name.uppercase()"Jack"}// var 修饰 初始化之后还可以做修改private var address by autoCleans("地址1")override fun onCreate(savedInstanceState: Bundle?) {Create(String()address = "新地址"}
}
  1. 代码很简单:因为FragmentActivity 和 Fragment都实现了LifecycleOwner接口,所以对LifecycleOwner进行扩展
/*** 扩展LifecycleOwner,对创建的对象,进行自动释放内存* 主要是对,Activity 和 Fragment、以及AppDelegate进行扩展* ReadWriteProperty 可读可写,* 使用的时候 修饰符用val 那么代表只读属性* 修饰符用var,那么代表属性可读可写。* 如果强制只读的话,那么可以 实现 ReadOnlyProperty接口,该接口只有getValue方法* 懒加载模式*/
inline fun <reified T : Any> LifecycleOwner.autoCleans(noinline objectFactory: ()-> T) :ReadWriteProperty<LifecycleOwner, T> = object :ReadWriteProperty<LifecycleOwner, T> {private var objects: T? = nullinit {lifecycle.addObserver(object : DefaultLifecycleObserver {override fun onDestroy(owner: LifecycleOwner) {Destroy(owner)//TODO 如果集合类型,应该先cleanobjects = veObserver(this)}})}override fun setValue(thisRef: LifecycleOwner, property: KProperty<*>, value: T) {objects = value}override fun getValue(thisRef: LifecycleOwner, property: KProperty<*>): T {objects?.let { return it }objects = objectFactory()return objects!!}// 对象销毁,会回调这个方法protected fun finalize() {}
}/*** 扩展LifecycleOwner,对创建的对象,进行自动释放内存*/
inline fun <reified T : Any> LifecycleOwner.autoCleans(obj: T): ReadWriteProperty<LifecycleOwner, T> = autoCleans { obj }

本文发布于:2024-01-31 04:54:33,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170664807625673.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23