3

我最近在我的申请中加入了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是从一个LocalBroadcastfrom an调用的AsyncTasks,它从服务器接收一个带有 new 的更新Markers

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;
}

这是我收到的 LogCat:

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)

我有 99.9% 的把握,那mMap不可能null。mMap 在 onCreate() 方法中设置。

有人有什么想法吗?

编辑:setupMap 函数

private void setUpMapIfNeeded() {

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

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

4 回答 4

8

这里icon通过的问题是null.

但是如果 Bitmap-Icon 为空,它不应该在 createMarker() 方法中崩溃吗?还是以后会崩溃,因为地图上没有图标tp地点?

是的,如果它直接在GoogleMap.addMarkeror内部抛出 NPE 会更好BitmapDescriptorFactory.fromBitmap,但它不会发生在你的内部createMapMarker,除非你调用一个方法 on icon

无法说出为什么会这样null,因为问题中没有相关代码,但我怀疑该进程在用户离开应用程序时被杀死,然后在他们返回时重新创建。

于 2013-07-04T07:47:20.507 回答
2

当长时间不使用或操作系统需要内存时,Android 会破坏您的应用程序。如果您将您MarkerOptions的内容保存onSaveInstanceState到以后尝试重新创建Marker,请注意该图标Marker不会Parcelable因此不保存。您需要将独立图标另存为BitmapParcelable并且在重新创建标记时执行addMarker(savedMarkerOptions.icon(bitmap));

于 2014-03-26T11:34:15.947 回答
1

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

于 2013-07-03T10:56:55.713 回答
0

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

于 2013-07-03T09:15:24.020 回答