gpt4 book ai didi

android - MapView 中的 Fragment 内存泄漏

转载 作者:行者123 更新时间:2023-12-02 00:16:40 25 4
gpt4 key购买 nike

我已经像这样将 map 添加到 fragment

public class SomeFragment extends Fragment {

MapView mapView;
GoogleMap map;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.some_layout, container, false);

// Gets the MapView from the XML layout and creates it
mapView = (MapView) v.findViewById(R.id.mapview);
mapView.onCreate(savedInstanceState);

// Gets to GoogleMap from the MapView and does initialization stuff
map = mapView.getMap();
map.getUiSettings().setMyLocationButtonEnabled(false);
map.setMyLocationEnabled(true);

// Needs to call MapsInitializer before doing any CameraUpdateFactory calls
try {
MapsInitializer.initialize(this.getActivity());
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}

// Updates the location and zoom of the MapView
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(43.1, -87.9), 10);
map.animateCamera(cameraUpdate);

return v;
}

@Override
public void onResume() {
mapView.onResume();
super.onResume();
}

@Override
public void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}

@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}

}

我从这篇文章中得到了这个想法

https://stackoverflow.com/a/26174573/1393695

它正在工作,但我遇到的问题是内存泄漏。我已经制作了第二个 fragment (用 addToBackStack(null) 替换(替换而不是添加)它),仅使用 View 和一个带有 manager.popBackStackImmediate() 的按钮,并且我正在测试它与 Canary Leak(没有捕获任何内容)和 Android Profiler。每次我转到该 fragment 并返回 map fragment 时,内存都会增加大约 10MB。

为了测试,我删除了 MapView 并且返回时交换 fragment 在内存中没有增加,所以我可以说问题出在 MapView 上。

我还尝试将 mapView.onDestroy() 放入 onDestroyView() (还在这里添加了 mapView = null ),正如有人在那篇文章的评论确实有一些帮助,并且在交换时内存没有被填满(它仍然是,但每次交换时内存都没有那么糟糕 1 - 5 MB)。但问题是当我交换 Fragments 20 多次时应用程序崩溃并且出现错误

java.lang.NullPointerException: Attempt to get length of null array at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:385)

所以我去搜索导致此问题的原因,并发现了几篇关于此问题的帖子(只会发布一篇)

Why google map v2 suddenly crashed by java.lang.NullPointerException: Attempt to get length of null array?

我尝试了那里的解决方案,但它不起作用(我仍然收到此错误)。但据我所知,有些人仍然在经历这种情况。我还阅读了其他帖子,但没有找到适合我的情况的内容。现在回答我的问题。

  1. 我在这里缺少什么?我应该如何在不“膨胀”(保留对 MapView 的引用)内存的情况下交换 fragment 。

  2. 我可以在 Activity 中创建 MapView 并在此 Fragment 中引用它吗(这样它就不会每次都重新创建),因为我的应用程序中的所有内容都围绕它旋转

  3. 将 map 放入一个 Activity 中,并将其余 fragment 放入其他 Activity 中(所有 fragment 都以某种方式与 map 进行通信,这就是我一开始就这样做的原因)

  4. 也许我做错了,可能有更好的方法? (不确定)

最佳答案

好吧,我找出了问题所在(我想我做到了),因为我不再在 map 上看到泄漏。

我将其添加到 onDestroyView fragment

@Override
public void onDestroyView() {
googleMap.clear()
mMapView?.onDestroy()
mMapView = null
super.onDestroyView()
}

我在一篇文章中读到,googleMap.clear() 和 MapView onDestroy() 应该位于 onDestroyView() 中,而不是 onDestroy() 方法中,因为未调用该回调。这样就消除了错误,但替换 fragment 时的内存问题仍然存在。一旦我添加了 mMapView = null ,我就可以知道哪里没有任何泄漏(我仍然会更好地调试它,如果我发现任何新内容,我会在这里发布)。

关于android - MapView 中的 Fragment 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46707628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com