没有日志的 MapView 崩溃

MapView crash without log

我有一个简单的 activity,只有一个 MapView 元素。地图加载正常,但一旦我放大/缩小应用程序就崩溃了,没有给我任何类型的日志(我也尝试过不使用包过滤器,但出现了任何有用的东西)。我唯一怀疑的是内存问题,但我不知道如何检查并最终修复它。

Activity:

public class PointsOfInterest extends AppCompatActivity implements OnMapReadyCallback {
    private MapView mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_map);

        /* MapView */
        mapView = (MapView) findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(this);
    }

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

    @Override
    public void onMapReady(GoogleMap map) {
        map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
    }

    @Override
    protected void onPause() {
        mapView.onPause();
        super.onPause();
    }

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

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

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }
}

布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="230dp" />

</LinearLayout>

更新:与片段同样的问题:

Activity:

public class PointsOfInterest extends AppCompatActivity implements OnMapReadyCallback {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_map);

        SupportMapFragment mMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mMapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {

    }
}

布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/map"
        class="com.google.android.gms.maps.SupportMapFragment"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="230dp" />

</LinearLayout>

顺便说一下,如果我尝试使用 "match_parent" 而不是 230dp,应用程序会在我移动地图或放大/缩小时立即重新启动(换句话说,当我必须加载新的地图数据时).地图越小,我可以使用它的时间就越长。 这让我更加想到内存问题(无论如何,加载地图时 RAM 使用量仅为 40MB,峰值为 50MB,立即 GC 再次下降到 40MB)

显然您正在尝试使用 lite mode 中的地图。该文件说,在该模式下,不允许用户平移或缩放。

如果您确实需要 pan/zoom 功能,请改为执行此操作:

1) 将此片段添加到您的 activity 布局 xml:

...
<fragment
        android:id="@+id/map"
        class="com.google.android.gms.maps.SupportMapFragment"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
...

2) 在您的 activity onCreate:

上像这样初始化地图
mMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mMapFragment.getMapAsync(this);