Address as Epoxy related memory leaks
- Thanks to @theimpulson for adding stupid but useful LeakyCanary <3
This commit is contained in:
committed by
Aayush Gupta
parent
c6e7166618
commit
5f9e381754
@@ -26,11 +26,13 @@ import android.view.ViewGroup
|
|||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
|
import com.airbnb.epoxy.EpoxyRecyclerView
|
||||||
import com.aurora.gplayapi.data.models.App
|
import com.aurora.gplayapi.data.models.App
|
||||||
import com.aurora.gplayapi.data.models.Category
|
import com.aurora.gplayapi.data.models.Category
|
||||||
import com.aurora.gplayapi.data.models.StreamCluster
|
import com.aurora.gplayapi.data.models.StreamCluster
|
||||||
import com.aurora.store.MobileNavigationDirections
|
import com.aurora.store.MobileNavigationDirections
|
||||||
import com.aurora.store.data.model.MinimalApp
|
import com.aurora.store.data.model.MinimalApp
|
||||||
|
import com.aurora.store.util.Log
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import java.lang.reflect.ParameterizedType
|
import java.lang.reflect.ParameterizedType
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -61,6 +63,7 @@ abstract class BaseFragment<ViewBindingType : ViewBinding> : Fragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
|
cleanupRecyclerViews(findAllRecyclerViews(requireView()))
|
||||||
_binding = null
|
_binding = null
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
}
|
}
|
||||||
@@ -116,4 +119,30 @@ abstract class BaseFragment<ViewBindingType : ViewBinding> : Fragment() {
|
|||||||
fun openAppMenuSheet(app: MinimalApp) {
|
fun openAppMenuSheet(app: MinimalApp) {
|
||||||
findNavController().navigate(MobileNavigationDirections.actionGlobalAppMenuSheet(app))
|
findNavController().navigate(MobileNavigationDirections.actionGlobalAppMenuSheet(app))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun cleanupRecyclerViews(recyclerViews: List<EpoxyRecyclerView>) {
|
||||||
|
recyclerViews.forEach { recyclerView ->
|
||||||
|
runCatching {
|
||||||
|
recyclerView.adapter?.let {
|
||||||
|
recyclerView.swapAdapter(it, true)
|
||||||
|
}
|
||||||
|
}.onFailure {
|
||||||
|
Log.e("Failed to cleanup RecyclerView", it.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun findAllRecyclerViews(view: View): List<EpoxyRecyclerView> {
|
||||||
|
val recyclerViews = mutableListOf<EpoxyRecyclerView>()
|
||||||
|
|
||||||
|
if (view is EpoxyRecyclerView) {
|
||||||
|
recyclerViews.add(view)
|
||||||
|
} else if (view is ViewGroup) {
|
||||||
|
for (i in 0 until view.childCount) {
|
||||||
|
recyclerViews.addAll(findAllRecyclerViews(view.getChildAt(i)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return recyclerViews
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user