0
votes

How can protect GoogleMap properly from being null?

It currently says mMap null inside the drawOnMap() method, but works when adding it to the onMapReady() method.

I wonder because isn't it true that the map may be initiated before I get the values from my intent if I ask for drawOnMap() inside onMapReady()?

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(startLatLng, 10));

public class DetailActivity extends AppCompatActivity implements OnMapReadyCallback {

private GoogleMap mMap;
private String locationA;
private String locationB;
private ArrayList<LatLng> latLngList;

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

    // Check if Google Maps have been activated, else starting it again.
    if (mMap == null) {
        SupportMapFragment smf = (SupportMapFragment) this.getSupportFragmentManager().findFragmentById(R.id.map);
        smf.getMapAsync(this);
    }

    // Settings up the views
    TextView mDistance = (TextView) findViewById(R.id.distanceDetail);
    TextView mDuration = (TextView) findViewById(R.id.durationDetail);
    TextView mLocationA = (TextView) findViewById(R.id.locationA);
    TextView mLocationB = (TextView) findViewById(R.id.locationB);


    // Getting the values
    Intent i = getIntent();
    locationA = i.getStringExtra("locA");
    locationB = i.getStringExtra("locB");
    String distance = i.getStringExtra("distance");
    String duration = i.getStringExtra("duration");


    // initiate the values.
    mDistance.setText(distance);
    mDuration.setText(duration);
    mLocationA.setText(locationA);
    mLocationB.setText(locationB);


    drawOnMap();
}





public void drawOnMap(){

    latLngList = getIntent().getParcelableArrayListExtra("points");

    // Används för att rita ut marksen på kartan sedan, start och stop.
    // Get the first and last postion to write out the marks on map
    LatLng startLatLng = latLngList.get(0);
    LatLng endLatLng = latLngList.get(latLngList.size() - 1);

    // Zooms into the start position;
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(startLatLng, 10));

    // Adding mark to start location
    mMap.addMarker(new MarkerOptions()
            .position(startLatLng)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))
            .title(locationA));

    // Adding mark to end location
    mMap.addMarker(new MarkerOptions()
            .position(endLatLng)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))
            .title(locationB));


    if (latLngList.size() > 0) {
        // Draw the route on map
        mMap.addPolyline(new PolylineOptions()
                .addAll(latLngList)
                .color(Color.argb(255, 55, 160, 255))
                .width(20));
    }
}



@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    UiSettings mapSettings = mMap.getUiSettings();
    mapSettings.setZoomControlsEnabled(true);
}

Catlog

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference at com.example.rasmusjosefsson.rjcar.DetailActivity.drawOnMap(DetailActivity.java:113) at com.example.rasmusjosefsson.rjcar.DetailActivity.onCreate(DetailActivity.java:96) at android.app.Activity.performCreate(Activity.java:6237) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

2

2 Answers

0
votes

Call drawOnMap method after map is ready.

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    UiSettings mapSettings = mMap.getUiSettings();
    mapSettings.setZoomControlsEnabled(true);

    drawOnMap();
}
0
votes

You will get the google map object in onMapReady() method that's why call drawOnMap() from this

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

   // Call drawOnMap() from here
}