Android 虽然调用了onMapReady,但GoogleMap正在变为null
我正在使用一个android应用程序,它有选项卡式的查看页面布局。我必须在viewpager的第一个屏幕上显示地图。映射包含在活动的片段中(AppCompatActivity->Fragment->map)。该应用程序有一项服务,用于在需要时更新地图 片段布局:Android 虽然调用了onMapReady,但GoogleMap正在变为null,android,google-maps,android-fragments,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/andr
<?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>
内部onCreateView()
:
内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
(用于侦听后台服务的位置更新)
当map在mapready(GoogleMap-GoogleMap)上加载时,
被调用,我将GoogleMap
存储到一个全局变量中以备将来使用。问题是当从服务调用pointTo(Location-Location)
get时,mGoogleMap
在此处发现null。但是当调用onMapReady(GoogleMap GoogleMap)时,mGoogleMap
被初始化
我已经尝试了几种方法,包括使用MapView
而不是使用SupportMapFragment
。但是没有想出任何解决办法
有什么线索或解决方法来解决这个问题吗?蒂亚
解决方案
经过几次尝试,最终得到了一个稳定的解决方案。我已经从HomeFragment中删除了MapViewUpdateListener
,并实现了一个LocalBroadCastReceiver
来接收来自服务的更新。实际上,我已经从HomeActivity
中删除了现有的LocalBroadCastReceiver
,并将其放入HomeFragment
中。当LocalBroadCastReceiver
在HomeFragment
中被激发时,我可以使用现有的mGoogleMap
而不使用任何NPE
但是,我仍然不知道为什么位置更新通过接口get NPE传递给实例变量。我想,我将
HomeFragment
初始化为MapViewUpdateListener
的方式可能有一些问题。可能是我通过类型转换得到的HomeFragment
对象返回一个新的HomeFragment
而不是现有的!!!(但很难相信会发生这种情况!)你在这里有比赛条件。尝试在pointTo
方法中设置标记(您已经这样做了),但要让null
检查mGoogleMap
是否为null
。
此外,如果在您收到位置更新后google地图已准备就绪(onMapReady
在pointTo
后被调用),则在onMapRead
y内更新标记(当调用pointTo方法时,使用变量纬度和经度)
所以,您指向的方法可以如下所示:
@Override
public void pointTo(Location location) {
if(mGoogleMap!=null){
Marker currentLocationMarker = mGoogleMap
.addMarker(new MarkerOptions()
.position(new
LatLng(location.getLatitude(),location.getLongitude()))
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
}
}
else{
latitude=location.latitude;//or whatever property is called
longitude=location.longitude;;//or whatever property is called
}
}
在map ready中,执行以下操作:
mGoogleMap = googleMap;
theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
googleMap.setMyLocationEnabled(true);
googleMap.setTrafficEnabled(true);
googleMap.setIndoorEnabled(true);
googleMap.setBuildingsEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
if(latitude!=null && longitude!=null){
//Insert marker here on map because we have map ready and latitude and longitude also
}
}
您在这里有竞态条件。尝试在pointTo
方法内设置标记(您已经这样做了),但是让null
检查mGoogleMap
是否为null
。
此外,如果在您收到位置更新后google地图已准备就绪(onMapReady
在pointTo
后被调用),则在onMapRead
y内更新标记(当调用pointTo方法时,使用变量纬度和经度)
所以,您指向的方法可以如下所示:
@Override
public void pointTo(Location location) {
if(mGoogleMap!=null){
Marker currentLocationMarker = mGoogleMap
.addMarker(new MarkerOptions()
.position(new
LatLng(location.getLatitude(),location.getLongitude()))
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
}
}
else{
latitude=location.latitude;//or whatever property is called
longitude=location.longitude;;//or whatever property is called
}
}
在map ready中,执行以下操作:
mGoogleMap = googleMap;
theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
googleMap.setMyLocationEnabled(true);
googleMap.setTrafficEnabled(true);
googleMap.setIndoorEnabled(true);
googleMap.setBuildingsEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
if(latitude!=null && longitude!=null){
//Insert marker here on map because we have map ready and latitude and longitude also
}
}
“问题是当从服务调用pointTo(Location Location)时”——服务不能调用活动或片段上的方法,除非您做错了什么。此侦听器具体在哪里,调用的确切程度如何,以及如何确保在onMapReady()之前不会调用它
被称为?@commonware实际上,HomeActivity
使用LocalBroadCastReceiver
从服务
获取位置更新。然后HomeActivity
使用MapViewUpdateListener
的指向(位置)传递位置更新
方法。服务没有直接使用Activity/Fragment方法。好的。您如何确保在onMapReady()之前不会调用pointTo()
?我在这里没有做任何特殊的事情。我只是调试并登录到logcat,发现onMapReady()
在调用pointTo()
之前被调用。@commonware有什么建议吗?“问题是从服务调用pointTo(位置)时”--服务无法调用活动或片段上的方法,除非您做错了什么。此侦听器的确切位置、调用它的确切方式以及如何确保在onMapReady()之前不会调用它
被称为?@commonware实际上,HomeActivity
使用LocalBroadCastReceiver
从服务
获取位置更新。然后HomeActivity
使用MapViewUpdateListener
的指向(位置)传递位置更新
方法。服务没有直接使用Activity/Fragment方法。好的。您如何确保在onMapReady()之前不会调用pointTo()
?我在这里没有做任何特殊的事情。我只是调试并登录到logcat,发现onMapReady()在调用pointTo()
之前调用了。@commonware有什么建议吗?onMapReady()
只调用一次,只要有新位置可用,就会调用pointTo()
。如果mGoogleMap
在pointTo()
中为空,则onMapReady()
不会被调用两次。因此没有办法在onMapReady()
中使用存储在pointTo()
方法中的lat、lang。googleMap在onMapReady中为null?如果发生这种情况,我不知道onMapReady()
只被调用一次并且pointTo()每当新位置可用时都会调用
。如果mGoogleMap
在pointTo()
中为空,则不会调用onMapReady()
mGoogleMap = googleMap;
theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
googleMap.setMyLocationEnabled(true);
googleMap.setTrafficEnabled(true);
googleMap.setIndoorEnabled(true);
googleMap.setBuildingsEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
if(latitude!=null && longitude!=null){
//Insert marker here on map because we have map ready and latitude and longitude also
}
}