更新地图时Android谷歌地图上的NullPointer异常

时间:2013-07-03 09:09:15

标签: android google-maps nullpointerexception

我最近在我的应用程序中添加了ACRA,其中包含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的{​​{1}}调用的,它从服务器接收带有新AsyncTasks的更新。

Markers

这是我收到的LogCat:

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%肯定,USER_COMMENT=null ANDROID_VERSION=4.1.1 APP_VERSION_NAME=0.9 BRAND=htc_europe PHONE_MODEL=HTC One X CUSTOM_DATA= STACK_TRACE=java.lang.NullPointerException at maps.aj.bk.a(Unknown Source) at maps.aj.bk.a(Unknown Source) at maps.aj.al.a(Unknown Source) at bcn.onTransact(SourceFile:167) at android.os.Binder.transact(Binder.java:326) at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addMarker(Unknown Source) at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source) at MYAPP.SignManager.updateSignsInView(SignManager.java:101) at MYAPP.MainActivity$1.onReceive(MainActivity.java:389) at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297) at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46) at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:155) at android.app.ActivityThread.main(ActivityThread.java:5493) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795) at dalvik.system.NativeStart.main(Native Method) 不能mMap。 mMap是在onCreate()方法中设置的。

任何想法?

编辑:setupMap功能

null

4 个答案:

答案 0 :(得分:8)

此处的问题是[{1}}传递的是icon

  

但是如果Bitmap-Icon为null,那么它不应该在createMarker()方法中崩溃吗?或者它会在以后崩溃,因为地图上没有图标tp位置?

是的,如果它直接在nullGoogleMap.addMarker内投放NPE会更好,但除非您在{{1}上调用方法,否则它不会发生在BitmapDescriptorFactory.fromBitmap内}。

无法告诉它为什么createMapMarker,因为问题中没有相关代码,但我怀疑当用户离开应用程序时会终止该进程,并在以后重新创建它们。

答案 1 :(得分:2)

Android长时间不使用或操作系统需要内存时会破坏您的应用。 如果您将MarkerOptions保存在onSaveInstanceState以后稍后尝试重新创建Marker,请注意Marker的图标不是Parcelable,因此未保存。您需要将Bitmap Parcelable作为addMarker(savedMarkerOptions.icon(bitmap));独立保存,并在重新创建标记时执行{{1}}

答案 2 :(得分:1)

一种可能性是,当你的asynctask正在运行时,当某个方向发生变化时,mMap会变为空。在这种情况下调用updateSignsInView时,尚未设置mMap,因此您在行Marker marker = mMap.addMarker(createMapMarker(mSignArray[i]));处得到一个nullpointer对于在此行之前调用的resetMap();,可能存在对mMap进行空检查,因此没有错误。

答案 3 :(得分:0)

您是否已将地图连接到xml文件中的Fragment?例如mmap = findViewbyId(R.id.map); ?