osmdroid 中InfoWindow 批量添加弹窗 走了close方法以后移除了页面但是没有GC回收内存一直增大最终闪退 给出具体解决方案和代码
在osmdroid中,可以通过自定义Marker来实现批量添加InfoWindow弹窗。以下是一个示例代码,演示了如何添加多个Marker及对应的InfoWindow:
public class MainActivity extends AppCompatActivity implements InfoWindowAdapter {
private MapView mapView;
private List<Marker> markerList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView = findViewById(R.id.map_view);
mapView.setTileSource(TileSourceFactory.MAPNIK);
mapView.setBuiltInZoomControls(true);
mapView.setMultiTouchControls(true);
markerList = new ArrayList<>();
// 创建Marker并添加到地图上
for (int i = 0; i < 10; i++) {
Marker marker = new Marker(mapView);
marker.setPosition(new GeoPoint(0, 0)); // 设置Marker的位置
marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
marker.setTitle("Marker " + i); // 设置Marker的标题
// 设置Marker的InfoWindow
marker.setInfoWindow(createInfoWindow(marker));
mapView.getOverlays().add(marker); // 将Marker添加到地图上
markerList.add(marker);
}
mapView.invalidate(); // 刷新地图
}
private InfoWindow createInfoWindow(final Marker marker) {
return new InfoWindow(R.layout.custom_info_window, mapView) {
@Override
public void onOpen(Object item) {
TextView titleTextView = mView.findViewById(R.id.info_title);
titleTextView.setText(marker.getTitle());
}
@Override
public void onClose() {
// 在关闭InfoWindow时移除Marker
mapView.getOverlays().remove(marker);
markerList.remove(marker);
mapView.invalidate(); // 刷新地图
}
};
}
@Override
public View getInfoWindow(Marker marker) {
return null;
}
@Override
public void onClose() {
}
}
在上述代码中,使用一个markerList来保存所有的Marker对象。当关闭InfoWindow时,通过mapView.getOverlays().remove(marker)将Marker从地图上移除,并通过markerList.remove(marker)将Marker从列表中移除。最后调用mapView.invalidate()刷新地图。
请注意,如果移除了Marker但内存没有得到释放,可能是由于其他原因导致的内存泄漏。你可以使用内存分析工具(如Android Profiler)来检查内存泄漏的具体原因,并及时处理。
如果内存问题仍然存在,你可以尝试使用弱引用(WeakReference)来保存Marker对象,以便在不使用时能够更容易地被GC回收。代码示例如下:
private List<WeakReference<Marker>> markerList;
// ...
for (int i = 0; i < 10; i++) {
Marker marker = new Marker(mapView);
// ...
markerList.add(new WeakReference<>(marker));
}
希望以上解决方案能够对你有所帮助。如果问题仍然存在,请提供更多相关代码和错误信息,以便我们能够更好地帮助你解决问题
原文地址: https://www.cveoy.top/t/topic/hDbS 著作权归作者所有。请勿转载和采集!