2013-07-03 2 views
3

최근 내 애플리케이션에 ACRA이 포함되어 있는데 여기에는 GoogleMapSupportFragment이 포함되어 있습니다. 이제 기기에서 재생할 수없는 충돌 보고서가 표시됩니다. 지도에 새 마커를 추가하려는 경우 앱이 다운됩니다. 모든 마커는 하나의 위치와 연결되어 있으며 자세한 정보 (주소, 이름, ....)가 있습니다. 지도를 업데이트하는 중 Android Google지도에서 NullPointer 예외가 발생했습니다.

다음은이 (때로는)을 NullPointerException 발생 기능, 인 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); 
    //... 
} 

를 관리하는 내 클래스입니다. updateSignsInView 함수는 AsyncTasks에서 LocalBroadcast으로 호출되며 서버에서 새로 업데이트 Markers을받습니다. mMapnull을 할 수없는, 내가 99,9 % 확신

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) 

: 여기

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

내가받은 로그 캣입니다. mMap은 onCreate() 메소드에서 설정됩니다.

누구나 아이디어가 있으십니까?

편집 : setupMap 기능

private void setUpMapIfNeeded() { 

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

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

BitmapDescriptorFactory.fromBitmap (아이콘)의 아이콘은 무엇입니까?어디서 초기화합니까? –

+0

mmh ... 좋은 지적. appstart에'icon'이 (인터넷에서)로드되고'icon'에 대한 참조가'LocationWO'-Model에 저장됩니다. 그러나'Bitmap-Icon'가'null'이라면'createMarker()'메소드에서 충돌이 발생하지 않아야합니까? 지도에 '아이콘'이 없기 때문에 나중에 충돌이 발생합니까? – longilong

답변

8

여기에서 문제는 icon이 통과하면 null입니다.

그러나 비트 맵 아이콘이 null 인 경우 createMarker() 메소드에서 충돌이 발생하지 않아야합니까? 지도에 아이콘 위치가 없기 때문에 나중에 충돌이 발생합니까? 이 GoogleMap.addMarker 또는 BitmapDescriptorFactory.fromBitmap 내부에 직접 NPE 던져 경우

예, 그것은 더 나은 것,하지만 당신은 icon에 메소드를 호출하지 않는 한 그것은 당신의 createMapMarker 내부 일어나지 않을 것입니다.

질문에 관련 코드가 없기 때문에 null이 무엇인지 알 수는 없지만 사용자가 응용 프로그램을 종료하고 다시 돌아올 때 프로세스가 종료 된 것으로 의심됩니다.

+0

안녕 매이, 답변 주셔서 감사합니다! 돌아올 때'icon'을 다시 만들어야합니다. 저는 아이콘을 다시로드하는 isAppInitialized() 메소드를 가지고 있습니다. 저는'MarkerOption'의'icon'을'null'으로 수동 설정하고 google map 표준 아이콘을로드하고 있습니다. 프로세스가 다운로드 한 이미지를 죽이지 만 'LocationWO'의 아이콘 참조는 죽이지 않는다는 것을 의미합니까? – longilong

+0

'LocationWO'는'icon : Bitmap'에 대한 참조를 포함합니까? 코드에서 '아이콘'은 필드 또는 정적 참조입니다. 그것을 업데이트하고'icon'에있는 관련 코드를 추가 할 수 있습니다. 'MarkerOptions.icon (null)'을 호출하면 제대로 작동합니다. 하지만 'MarkerOptions.icon (BitmapDescriptorFactory.fromBitmap (null))'을 호출하면 안됩니다. –

+0

예! 나는 그 오류를 재현 할 수 있었다. 고마워요! 아직 아이디어가 없다. 왜'아이콘'이'null'이되는지, 그러나 우리는 내일 볼 것이다. – longilong

0

XML 파일의 조각에지도를 연결 했습니까? 예 : mmap = findViewbyId (R.id.map); ?

+0

예. 했어요. 방금 대답을 업데이트했습니다. Btw : 앱이 작동하기 때문에 때로는 오류가 매번 나타나지 않습니다. – longilong

1

asynctask가 실행되는 동안 방향 변경이 발생할 때 mMap이 null이되는 경우가 있습니다. 이 경우 updateSignsInView이 호출 될 때 mMap이 아직 설정되지 않았으므로 줄에서 nullpointer를 가져옵니다. 이 줄 앞에 호출되는 resetMap();의 경우 mMap에 대한 null 검사가 가능하므로 오류가 발생하지 않을 수 있습니다.

+0

안녕하세요. 내 앱은 세로 모드에서만 실행됩니다. 다른 null 검사에 대해서도 생각했지만 여전히 실제 문제를 발견하는 것이 좋습니다. (나는 오류를 재현 할 수 없다) – longilong

2

Android는 오랫동안 사용되지 않았거나 OS에 메모리가 필요할 때 앱을 파괴합니다. MarkerOptionsonSaveInstanceState에 저장하고 나중에 Marker을 다시 만들려고했는데 Marker 아이콘이 Parcelable이 아니므로 저장되지 않았습니다. 독립적으로 아이콘을 Parcelable으로 만들고 아이콘을 다시 만들 때 addMarker(savedMarkerOptions.icon(bitmap));

관련 문제