【发布时间】:2020-07-21 16:01:18
【问题描述】:
我正在制作一个带有谷歌地图活动的应用程序,并在其上显示叠加层和标记。这些标记是可点击的,它们会转到另一个活动,其中包含有关该位置的信息。用户从此活动返回到地图活动。当对此进行测试并在地图活动和信息活动之间来回切换时,大约在第 8 次返回地图活动时,它会崩溃。在使用 Android Studio 中的分析器进行进一步调查后,我注意到每当我返回地图活动时,内存使用量都会大幅增加,而且不会下降。就像每次您重新打开地图活动时,它都会在之前加载的内容之上重新加载我在 onCreate 调用中启动的所有内容。这会很奇怪,因为我在转到信息活动时不会破坏 MapS 活动,所以它不应重新加载所有图像和变量。分析器还说 Maps 活动只是停止并没有被破坏。 返回主菜单时,我尝试使用 MapS.super.finish 来查看 GC 是否会释放内存,但不会。
MapS 活动;
public class MapS extends AppCompatActivity implements OnMapReadyCallback {
private GoogleMap mMap;
private FusedLocationProviderClient mFusedLocationProviderClient;
private Location mLastKnownLocation;
private LocationCallback locationCallback;
private final float DEFAULT_ZOOM = 18;
private View mapView;
private Overlay[] floor0;
private Overlay[] floor1;
private int height = 120;
private int width = 90;
private HashMap<String,Bitmap> icons = new HashMap<>();
Circle mapCircle = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.MapS);
assert mapFragment != null;
mapFragment.getMapAsync(this);
mapView = mapFragment.getView();
mFusedLocationProviderClient = getFusedLocationProviderClient(MapS.this);
Places.initialize(MapS.this, ("MY API KEY GOES HERE"));
HERE I DEFINE SOME BUTTONS AND I CREATE MY OVERLAY OBJECTS (THESE CONTAIN A BITMAPDESCRIPTORFACTORY,COORDINATES AND SOME INTEGERS)
WHEN THE BUTTONS GO TO ANOTHER ACTIVITY THAN THE INFO ACTIVITY OF A LOCATION, I DO MapS.super.finish() TO DESTROY THE MAPS ACTIVITY
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 51) {
if (resultCode == RESULT_OK) {
getDeviceLocation();
}
}
}
@SuppressLint("MissingPermission")
private void getDeviceLocation() {
GET DEVICE LOCATION
}
@Override
public void onMapReady(final GoogleMap googleMap) {
googleMap.clear();
//This is the part that initializes the overlays and the markers
//display floor 0 at the start
HERE I HAVE THE CODE THAT ADDS THE OVERLAYS TO THE MAP? LET'S THE USER SWITCH BETWEEN FLOORS AND ADDS THE MARKERS, IT ALSO CHECKS IF THE USER IS INSIDE A CERTAIN RANGE OF A MARKER AND IF SO HE CAN CLICK THE MARKER AND GO TO IT'S INFO ACTIVITY
}
@Override
public void onDestroy() {
super.onDestroy();
Runtime.getRuntime().gc();
}
}
【问题讨论】:
-
请修剪代码
-
Marcin,现在好些了吗?
-
是的,这样更好,谢谢。一般来说:stackoverflow.com/help/minimal-reproducible-example
标签: java android google-maps memory