Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新地图时Android Google地图上出现空指针异常_Android_Google Maps_Nullpointerexception - Fatal编程技术网

更新地图时Android Google地图上出现空指针异常

更新地图时Android Google地图上出现空指针异常,android,google-maps,nullpointerexception,Android,Google Maps,Nullpointerexception,我最近在我的应用程序中加入了一个GoogleMapSupportFragment。我现在得到一些崩溃报告,我无法在我的设备上复制。如果我想在地图上添加新标记,应用程序就会崩溃。每个标记都与一个位置相连,该位置包含更多信息(地址、名称等) 这是我的班级,负责管理GoogleMap public SignManager(MainActivity activity, GoogleMap map) { mActivity = activity; this.mMap = map;

我最近在我的应用程序中加入了一个
GoogleMapSupportFragment
。我现在得到一些崩溃报告,我无法在我的设备上复制。如果我想在地图上添加新标记,应用程序就会崩溃。每个标记都与一个位置相连,该位置包含更多信息(地址、名称等)

这是我的班级,负责管理
GoogleMap

public SignManager(MainActivity activity, GoogleMap map) {
    mActivity = activity;
    this.mMap = map;

    initMap();
}


private void initMap() {
    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    mMap.setMyLocationEnabled(true);
    //...
}
这就是函数,它(有时)抛出
NullPointerException
。函数
updateSignsInView
LocalBroadcast
AsyncTasks
调用,该函数从服务器接收带有新
标记的更新

public void updateSignsInView(LocationWO[] mSignArray) {

    if(mSignArray == null){
        Log.e(DEBUG_TAG,"updateSignsInView() -> mSignArray null");
        return;
    }

    resetMap();  //delete some unneeded data and do mMap.clear()

    mMarkerLocationMap = new HashMap<Marker, LocationWO>();

    for (int i = 0; i < mSignArray.length; i++) {

        //!!! this is the bad line: SignManager.java:101  
        Marker marker = mMap.addMarker(createMapMarker(mSignArray[i])); 

        mMarkerLocationMap.put(marker, mSignArray[i]);
    }

}


 //create a new Marker with given information
 private MarkerOptions createMapMarker(LocationWO mLocation) {

    MarkerOptions mMarker = new MarkerOptions()
    .position(
        new LatLng(mLocation.getmLatitude(), mLocation
            .getmLongitude()))
    .title(mLocation.getmName()
            .icon(BitmapDescriptorFactory.fromBitmap(icon));

    return mMarker;
}
我99.9%确定,
mMap
不能为
null
。mMap是在onCreate()方法中设置的

有人有什么想法吗

编辑:设置地图功能

private void setUpMapIfNeeded() {

    if (mMap == null) {
        mMap = ((SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map_screen)).getMap();

        if (mMap != null) {
            setUpMap();
        }
    }
}

您是否将映射连接到xml文件中的片段?e、 g mmap=findviewbyd(R.id.map)

一种可能性是,在某些情况下,当异步任务运行时发生方向更改时,mMap将变为null。在这种情况下,当调用
updateSignsView
时,mMap尚未设置,因此在
Marker Marker=mMap.addMarker(createMapMarker(mSignArray[i])行上会得到一个空指针用于
resetMap()在此行之前被调用,可能有一个mMap的空检查,因此没有错误。

这里的问题是
图标
传递的是
null

但是如果位图图标为null,它是否应该在createMarker()方法中崩溃?或者它会在以后崩溃,因为地图上没有图标位置

是的,如果它直接在
GoogleMap.addMarker
BitmapDescriptorFactory.fromBitmap
中抛出NPE会更好,但它不会发生在
createMapMarker
中,除非您在
图标上调用一个方法


由于问题中没有相关的代码,所以无法解释为什么它是空的,但我怀疑当用户离开应用程序时,进程会被终止,然后在用户返回时重新创建。

当长时间不使用应用程序或操作系统需要内存时,Android会破坏您的应用程序。
如果您将
标记选项保存在
onSaveInstanceState
中,以便稍后尝试重新创建
标记
请注意,
标记
的图标不可
包裹
,因此不会保存。您需要将图标单独保存为
位图
,该位图是
可打包的
,并且在重新创建标记时执行
添加标记(savedMarkerOptions.icon(位图))

是的,我做了。我刚刚更新了我的答案。顺便说一句:这个应用程序正在运行,所以这个错误并不是每次都出现,只是偶尔会出现。嗨,托尼,我的应用程序只是在纵向模式下运行。我也考虑过另一个空检查,但如果能找到真正的问题还是不错的。(我无法再现错误)BitmapDescriptorFactory.fromBitmap(图标)
中的
图标是什么?你从哪里开始的?嗯…说得好。将
图标
加载到appstart上(从internet),并在
位置wo
-模型中存储对该
图标的引用。但是,如果位图图标
null
,它不应该在
createMarker()
方法中崩溃吗?或者它会在以后崩溃,因为地图上没有
图标
tp位置?嗨,梅西,谢谢你的回答<返回时应重新创建代码>图标
。我有一个检查方法
isAppInitialized()
,它正在重新加载图标。。我手动将
标记选项中的
图标设置为
null
,它正在加载谷歌地图标准图标。您的意思是,该过程会终止下载的图像,但不会终止
LocationWO
中的图标引用吗
LocationWO
是否包含对
图标:位图的引用?从代码上看,它看起来像
图标
是字段或静态引用。您可能需要更新它,并添加初始化
图标的相关代码。如果调用
MarkerOptions.icon(null)
它应该可以工作。但是如果你调用
MarkerOptions.icon(BitmapDescriptorFactory.fromBitmap(null))
就不应该这样做。是的!我可以重现这个错误。谢谢!还不知道为什么
图标
会得到
空值
,但我们明天再看
private void setUpMapIfNeeded() {

    if (mMap == null) {
        mMap = ((SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map_screen)).getMap();

        if (mMap != null) {
            setUpMap();
        }
    }
}