From 9afcd3661f205f37ea225d6a2f7a2396db7171f0 Mon Sep 17 00:00:00 2001 From: LooKeR Date: Tue, 9 Nov 2021 12:05:43 +0530 Subject: [PATCH] Fix: Memory Leak by ViewBinding --- .../looker/droidify/screen/EditRepositoryFragment.kt | 6 ++++-- .../com/looker/droidify/screen/RepositoryFragment.kt | 12 ++++++------ .../com/looker/droidify/screen/ScreenFragment.kt | 12 +++++++++--- .../com/looker/droidify/screen/SettingsFragment.kt | 3 ++- .../com/looker/droidify/screen/TabsFragment.kt | 7 +++++-- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt b/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt index e71f7a90..c9e25b5c 100644 --- a/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt @@ -43,7 +43,8 @@ import kotlin.math.min class EditRepositoryFragment() : ScreenFragment() { - private lateinit var editRepositoryBinding: EditRepositoryBinding + private var _editRepositoryBinding: EditRepositoryBinding? = null + private val editRepositoryBinding get() = _editRepositoryBinding!! companion object { private const val EXTRA_REPOSITORY_ID = "repositoryId" @@ -86,7 +87,7 @@ class EditRepositoryFragment() : ScreenFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - editRepositoryBinding = EditRepositoryBinding.inflate(layoutInflater) + _editRepositoryBinding = EditRepositoryBinding.inflate(layoutInflater) syncConnection.bind(requireContext()) @@ -259,6 +260,7 @@ class EditRepositoryFragment() : ScreenFragment() { syncConnection.unbind(requireContext()) checkDisposable?.dispose() checkDisposable = null + _editRepositoryBinding = null } private var addressError = false diff --git a/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt b/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt index 4b8c1ab8..a95defe2 100644 --- a/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt @@ -11,7 +11,6 @@ import android.view.ViewGroup import androidx.appcompat.widget.LinearLayoutCompat import androidx.core.widget.NestedScrollView import androidx.lifecycle.lifecycleScope -import com.google.android.material.textview.MaterialTextView import com.looker.droidify.R import com.looker.droidify.database.Database import com.looker.droidify.databinding.TitleTextItemBinding @@ -19,7 +18,6 @@ import com.looker.droidify.service.Connection import com.looker.droidify.service.SyncService import com.looker.droidify.utility.Utils import com.looker.droidify.utility.extension.resources.getColorFromAttr -import com.looker.droidify.utility.extension.resources.inflate import com.looker.droidify.utility.extension.resources.sizeScaled import io.reactivex.rxjava3.disposables.Disposable import kotlinx.coroutines.Dispatchers @@ -28,7 +26,7 @@ import java.util.* class RepositoryFragment() : ScreenFragment() { - private lateinit var titleBinding: TitleTextItemBinding + private var titleBinding: TitleTextItemBinding? = null companion object { private const val EXTRA_REPOSITORY_ID = "repositoryId" @@ -98,6 +96,7 @@ class RepositoryFragment() : ScreenFragment() { super.onDestroyView() layout = null + titleBinding = null syncConnection.unbind(requireContext()) repositoryDisposable?.dispose() repositoryDisposable = null @@ -164,10 +163,11 @@ class RepositoryFragment() : ScreenFragment() { private fun LinearLayoutCompat.addTitleText(titleResId: Int, text: CharSequence) { if (text.isNotEmpty()) { - val layout = inflate(R.layout.title_text_item) - val titleView = layout.findViewById(R.id.title)!! + val binding = TitleTextItemBinding.inflate(layoutInflater) + val layout = binding.root + val titleView = binding.title + val textView = binding.text titleView.setText(titleResId) - val textView = layout.findViewById(R.id.text)!! textView.text = text addView(layout) } diff --git a/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt index e73583eb..0671ea3a 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt @@ -10,7 +10,8 @@ import com.google.android.material.appbar.CollapsingToolbarLayout import com.looker.droidify.databinding.FragmentBinding open class ScreenFragment : BaseFragment() { - lateinit var fragmentBinding: FragmentBinding + private var _fragmentBinding: FragmentBinding? = null + val fragmentBinding get() = _fragmentBinding!! lateinit var toolbar: Toolbar lateinit var collapsingToolbar: CollapsingToolbarLayout @@ -18,17 +19,22 @@ open class ScreenFragment : BaseFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - fragmentBinding = FragmentBinding.inflate(layoutInflater) + _fragmentBinding = FragmentBinding.inflate(layoutInflater) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View? { this.toolbar = fragmentBinding.toolbar this.collapsingToolbar = fragmentBinding.collapsingToolbar this.appBar = fragmentBinding.appbarLayout return fragmentBinding.root } + + override fun onDestroyView() { + super.onDestroyView() + _fragmentBinding = null + } } diff --git a/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt index cd6ff86c..5c94f0de 100644 --- a/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.flow.collect class SettingsFragment : ScreenFragment() { - private lateinit var preferenceBinding: PreferenceItemBinding + private var preferenceBinding: PreferenceItemBinding? = null private val preferences = mutableMapOf, Preference<*>>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -173,6 +173,7 @@ class SettingsFragment : ScreenFragment() { override fun onDestroyView() { super.onDestroyView() preferences.clear() + preferenceBinding = null } private fun updatePreference(key: Preferences.Key<*>?) { diff --git a/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt index 6fcdd893..d3b13538 100644 --- a/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt @@ -39,7 +39,8 @@ import kotlin.math.* class TabsFragment : ScreenFragment() { - private lateinit var tabsBinding: TabsToolbarBinding + private var _tabsBinding: TabsToolbarBinding? = null + private val tabsBinding get() = _tabsBinding!! companion object { private const val STATE_SEARCH_FOCUSED = "searchFocused" @@ -103,7 +104,7 @@ class TabsFragment : ScreenFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - tabsBinding = TabsToolbarBinding.inflate(layoutInflater) + _tabsBinding = TabsToolbarBinding.inflate(layoutInflater) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -312,6 +313,8 @@ class TabsFragment : ScreenFragment() { repositoriesDisposable = null sectionsAnimator?.cancel() sectionsAnimator = null + + _tabsBinding = null } override fun onSaveInstanceState(outState: Bundle) {