3

私は最近、アプリケーションにACRAGoogleMapSupportFragmentを含めました。デバイスで再現できないクラッシュ レポートが表示されるようになりました。新しいマーカーをマップに配置しようとすると、アプリがクラッシュします。すべてのマーカーは、詳細情報 (住所、名前など) を持つ 1 つの場所に接続されています。

これが管理する私のクラスです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、サーバーからAsyncTasksnew による更新を受け取り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 が null の場合、createMarker() メソッドでクラッシュするべきではありませんか? それとも、マップに場所のアイコンがないため、後でクラッシュしますか?

GoogleMap.addMarkerはい、NPE をor内で直接スローした方がよいでしょうが、メソッドを on で呼び出さない限り、BitmapDescriptorFactory.fromBitmap内部では発生しません。createMapMarkericon

質問に関連するコードがないため、理由を判断することはできませんがnull、ユーザーがアプリケーションを離れるとプロセスが強制終了され、後で戻ったときに再作成されると思われます。

于 2013-07-04T07:47:20.507 に答える
2

Android は、長時間使用されなかったり、OS がメモリを必要としたりすると、アプリを破棄します。後で再作成しようとした場合に保存MarkerOptionsした場合、そのアイコンは保存されないことに注意してください。個別にアイコンをwhich isとして保存する必要があり、マーカーを再作成するときは doonSaveInstanceStateMarkerMarkerParcelableBitmapParcelableaddMarker(savedMarkerOptions.icon(bitmap));

于 2014-03-26T11:34:15.947 に答える
1

可能性の 1 つは、asynctask の実行中に方向の変更が発生した場合に、mMap が null になる場合があることです。このような場合、updateSignsInViewが呼び出されると、mMap はまだセットアップされていないため、この行の前に呼び出されている行で nullpointer を取得します。mMapMarker marker = mMap.addMarker(createMapMarker(mSignArray[i]));resetMap();null チェックが行われる可能性があるため、エラーは発生しません。

于 2013-07-03T10:56:55.713 に答える
0

xml ファイルでマップを Fragment に接続しましたか? 例: mmap=findViewbyId(R.id.map); ?

于 2013-07-03T09:15:24.020 に答える