android 支持地图片段:java.lang.NullPointerException

android SupportMapFragment : java.lang.NullPointerException

我在 map.setOnMyLocationChangeListener(myLocationChangeListener); 线上收到 java.lang.NullPointerException。奇怪的是,在某些设备 运行 中出现此异常,而在某些设备中则不会。我该如何解决?

public class MyMap extends ActionBarActivity implements
    RoutingListener, OnMapReadyCallback,
     SensorEventListener {

// private GoogleApiClient mGoogleApiClient;
protected GoogleMap map;

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

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

    if (mapFragment == null) {
        mapFragment = SupportMapFragment.newInstance();
        getSupportFragmentManager().beginTransaction().replace(R.id.map, mapFragment).commit();
    }

    mapFragment.getMapAsync(this);
    map = mapFragment.getMap();


    map.setOnMyLocationChangeListener(myLocationChangeListener);
}

编辑:

@Override
public void onMapReady(GoogleMap mMap) {
    map = mMap;

    mUiSettings = map.getUiSettings();
    mUiSettings.setZoomControlsEnabled(true);
    mUiSettings.setCompassEnabled(true);

    updateMyLocation();


}

当您使用 GoogleMap 时,初始化需要时间。有时在某些设备上花费的时间比其他设备长。

要解决此问题,您应该延迟初始化 GoogleMap 对象。您可以遵循以下策略:

private Handler handler = new Handler();

private Runnable mapChecker = new Runnable() {

    @Override
    public void run() {
        try {

            if (mapFragment.getMap() != null) {

                map = mapFragment.getMap();
                map.setOnMyLocationChangeListener(myLocationChangeListener);

                return;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        handler.postDelayed(mapChecker, 500);
    }
};

然后从onCreate(),

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

    ..........

    handler.postDelayed(mapChecker, 500);

    ..........

}

通过调用 mapFragment.getMapAsync(this);,我想您必须覆盖此方法 public void onMapReady(GoogleMap googleMap)。在那里设置你的 mMap = googleMap 并在那里设置所有其他监听器。请记住,您的 Map 对象需要一些时间来初始化,这就是他们为您提供 getMapAsync 方法的原因。

已编辑:

请将此从您的 onCreated

中删除

map = mapFragment.getMap(); map.setOnMyLocationChangeListener(myLocationChangeListener);

并把 他们 map.setOnMyLocationChangeListener(myLocationChangeListener); 放在你的 onMapReady() 这一行 map = mMap 之后。请确认您的地图已初始化。