У меня есть Bottom Navigation View
с 4 вкладками, и одна из них содержит Huawei MapView
. Когда я переключаюсь с вкладки A, содержащей MapView, на вкладку B, Leak Canary
показывает утечку памяти, связанную с MapView
Fragment
содержит только MapView
, дополнительного вида нет
class MapFragment : BaseFragment(R.layout.fragment_map), OnMapReadyCallback {
private var hMap: HuaweiMap? = null
companion object {
private const val MAPVIEW_BUNDLE_KEY = "MapViewBundleKey"
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
initHuaweiMap(savedInstanceState)
}
private fun initHuaweiMap(savedInstanceState: Bundle?) {
var mapViewBundle: Bundle? = null
if (savedInstanceState != null) {
mapViewBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY)
}
map_view?.apply {
onCreate(mapViewBundle)
getMapAsync(this@MapFragment)
}
}
override fun onMapReady(map: HuaweiMap?) {
hMap = map
hMap?.setMapStyle(MapStyleOptions.loadRawResourceStyle(requireContext(), R.raw.mapstyle_night_hms))
hMap?.isMyLocationEnabled = false // Enable the my-location overlay.
hMap?.uiSettings?.isMyLocationButtonEnabled = false // Enable the my-location icon.
hMap?.uiSettings?.isZoomControlsEnabled = false // Disable zoom-in zoom-out buttons
}
override fun onStart() {
map_view?.onStart()
super.onStart()
}
override fun onStop() {
map_view?.onStop()
super.onStop()
}
override fun onDestroy() {
map_view?.onDestroy()
super.onDestroy()
}
override fun onPause() {
map_view?.onPause()
super.onPause()
}
override fun onResume() {
map_view?.onResume()
super.onResume()
}
override fun onLowMemory() {
map_view?.onLowMemory()
super.onLowMemory()
}
override fun onDestroyView() {
hMap?.clear()
hMap = null
map_view?.onDestroy()
super.onDestroyView()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
var mapViewBundle = outState.getBundle(MAPVIEW_BUNDLE_KEY)
if (mapViewBundle == null) {
mapViewBundle = Bundle()
outState.putBundle(MAPVIEW_BUNDLE_KEY, mapViewBundle)
}
map_view?.onSaveInstanceState(mapViewBundle)
}
}
Мой файл макета
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ui.tabs.profile.Mapragment">
<com.huawei.hms.maps.MapView
android:id="@+id/map_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:cameraZoom="14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Я использую весь метод жизненного цикла, связанный с MapView, но все равно вызываю утечку памяти
Последний шаг он говорит;
MapFragment получил обратный вызов Fragment#onDestroyView() (ссылки на его представления должны быть очищены, чтобы предотвратить утечку)
Я очищаю ссылки на onDestroyView
, но все равно получаю ту же ошибку. Как я могу предотвратить эту утечку памяти?