尽管调用onMapReady,GoogleMap仍然为空

时间:2017-07-22 20:32:49

标签: android google-maps android-fragments

我正在使用一个带有标签视图寻呼机布局的Android应用程序。我要在viewpager的第一个屏幕上显示一张地图。地图包含在片段中的活动中(AppCompatActivity - > Fragment - > Map)。该应用程序有一项服务,用于在需要时更新地图。

片段布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

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

</RelativeLayout>

内部碎片:

public class HomeFragment extends Fragment implements OnMapReadyCallback, MapViewUpdateListener {

    private GoogleMap mGoogleMap;

onCreateView()内:

SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));
mapFragment.getMapAsync(this);

onMapReady

@Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;
            theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    googleMap.setMyLocationEnabled(true);
    googleMap.setTrafficEnabled(true);
    googleMap.setIndoorEnabled(true);
    googleMap.setBuildingsEnabled(true);
    googleMap.getUiSettings().setZoomControlsEnabled(true);
}

MapViewUpdateListener内(用于监听后台服务的位置更新)

@Override
public void pointTo(Location location) {
      Marker currentLocationMarker = mGoogleMap
                .addMarker(new MarkerOptions()
                .position(new LatLng(location.getLatitude(),location.getLongitude()))
                .icon(BitmapDescriptorFactory
                .defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
    }
}

正在加载地图onMapReady(GoogleMap googleMap)正在调用,我将googleMap存储到全局变量中以供将来使用。问题是当pointTo(Location location)从服务调用时,mGoogleMap在此处发现了null。但是mGoogleMap被调用时会初始化onMapReady(GoogleMap googleMap)

我尝试过几种方式,包括使用MapView而不是SupportMapFragment。但是没有提出任何解决方案!

解决此问题的任何线索或解决方法? TIA。

经过多种方式尝试后终于得到了稳定的解决方案。我已从HomeFragment中删除MapViewUpdateListener并实施LocalBroadCastReceiver以从服务接收更新。实际上,我已将LocalBroadCastReceiver中的现有HomeActivity移除,并将其放入HomeFragmentLocalBroadCastReceiver HomeFragmentmGoogleMap解雇时,我可以使用现有的HomeFragment而无需任何NPE。

但是,我仍然不知道为什么位置更新通过接口获取实例变量的NPE。我想,我将MapViewUpdateListener初始化为HomeFragment的方式可能存在一些问题。可能是我通过类型转换获得的HomeFragment对象返回一个新的{{1}}而不是现有的{{1}}! (但很难相信会发生这种情况!)

1 个答案:

答案 0 :(得分:0)

你这里有竞争条件。尝试在pointTo方法中设置标记(您已经这样做了)但null检查mGoogleMap是否为null。 此外,如果您收到位置更新(onMapReady在[{1}}后调用{}}更新标记pointTo y(包含变量onMapRead和{{1})后谷歌地图已准备就绪当调用pointTo方法时。

所以,你pointTo方法可能如下所示:

latitude

在地图准备就绪中执行此操作:

longitude