Skip to content

Commit

Permalink
fix: ViewGroup 销毁的时候释放资源 (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
hi-dhl committed May 11, 2022
1 parent 000c119 commit 0104c72
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 17 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ android {

defaultConfig {
applicationId "com.hi.dhl.demo.binding"
minSdkVersion 26
minSdkVersion 24
targetSdkVersion 30
versionCode 1
versionName "1.0"
Expand Down
19 changes: 3 additions & 16 deletions binding/src/main/java/com/hi/dhl/binding/base/ActivityDelegate.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@ package com.hi.dhl.binding.base
import android.app.Activity
import android.os.Build
import androidx.activity.ComponentActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import androidx.viewbinding.ViewBinding
import com.hi.dhl.binding.LifecycleFragment
import com.hi.dhl.binding.observerWhenDestroyed
import com.hi.dhl.binding.registerLifecycleBelowQ
import kotlin.properties.ReadOnlyProperty

/**
Expand Down Expand Up @@ -37,20 +35,9 @@ abstract class ActivityDelegate<T : ViewBinding>(

}

/**
* 当继承 Activity 且 Build.VERSION.SDK_INT < Build.VERSION_CODES.Q 以下的时候,
* 会添加一个 空白的 Fragment, 当生命周期处于 onDestroy 时销毁数据
*/
fun addLifecycleFragment(activity: Activity) {
if (activity is FragmentActivity || activity is AppCompatActivity) return

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) return

val fragmentManager = activity.fragmentManager
if (fragmentManager.findFragmentByTag(LIFECYCLE_FRAGMENT_TAG) == null) {
val transaction = fragmentManager.beginTransaction()
transaction.add(LifecycleFragment { destroyed() }, LIFECYCLE_FRAGMENT_TAG).commit()
fragmentManager.executePendingTransactions()
activity.registerLifecycleBelowQ {
destroyed()
}
}

Expand Down
21 changes: 21 additions & 0 deletions binding/src/main/java/com/hi/dhl/binding/ext/LifecycleExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import android.app.Application
import android.app.Fragment
import android.os.Build
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.BindingLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
Expand Down Expand Up @@ -98,3 +100,22 @@ class LifecycleFragment : Fragment {
destroyed = null
}
}

/**
* 当继承 Activity 且 Build.VERSION.SDK_INT < Build.VERSION_CODES.Q 以下的时候,
* 会添加一个 空白的 Fragment, 当生命周期处于 onDestroy 时销毁数据
*/
private const val LIFECYCLE_FRAGMENT_TAG = "com.hi.dhl.binding.lifecycle_fragment"
internal inline fun Activity.registerLifecycleBelowQ(crossinline destroyed: () -> Unit) {
val activity = this
if (activity is FragmentActivity || activity is AppCompatActivity) return

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) return

val fragmentManager = activity.fragmentManager
if (fragmentManager.findFragmentByTag(LIFECYCLE_FRAGMENT_TAG) == null) {
val transaction = fragmentManager.beginTransaction()
transaction.add(LifecycleFragment { destroyed() }, LIFECYCLE_FRAGMENT_TAG).commit()
fragmentManager.executePendingTransactions()
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.hi.dhl.binding.viewbind

import android.app.Activity
import android.os.Build
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.activity.ComponentActivity
import androidx.viewbinding.ViewBinding
import com.hi.dhl.binding.inflateMethod
import com.hi.dhl.binding.inflateMethodWithViewGroup
import com.hi.dhl.binding.observerWhenDestroyed
import com.hi.dhl.binding.registerLifecycleBelowQ
import java.lang.reflect.Method
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
Expand Down Expand Up @@ -32,6 +37,22 @@ class ViewGroupViewBinding<T : ViewBinding>(
} else {
layoutInflater = classes.inflateMethod()
}

viewGroup?.apply {
when (context) {
is ComponentActivity -> {
(context as ComponentActivity).lifecycle.observerWhenDestroyed { destroyed() }
}
is Activity -> {
val activity = context as Activity
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
activity.observerWhenDestroyed { destroyed() }
} else {
activity.registerLifecycleBelowQ { destroyed() }
}
}
}
}
}

override fun getValue(thisRef: ViewGroup, property: KProperty<*>): T {
Expand Down

0 comments on commit 0104c72

Please sign in to comment.