NullPointer Exception en Android Google Maps durante la actualización de Mapa

Recientemente he incluido ACRA en mi aplicación, que incluye un GoogleMapSupportFragment . Ahora obtengo algunos informes de fallos, que no puedo reproducir en mi dispositivo. La aplicación se bloquea, si quiero poner nuevos marcadores en el mapa. Cada marcador está conectado con una ubicación, que tiene más información (dirección, nombre, ….).

Esta es mi clase que administra 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); //... } 

Esta es la función, que (a veces) lanza NullPointerException . La función updateSignsInView se llama desde un LocalBroadcast de un AsyncTasks , que recibe una actualización con nuevos Markers del servidor.

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

Aquí está el LogCat que recibí:

 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) 

Estoy 99,9% seguro, que mMap no puede ser null . mMap se configura en el método onCreate ().

Alguien alguna idea?

EDIT: función setupMap

 private void setUpMapIfNeeded() { if (mMap == null) { mMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map_screen)).getMap(); if (mMap != null) { setUpMap(); } } } 

El problema aquí es icon pasado es null .

Pero si el icono de mapa de bits es nulo, ¿no debería bloquearse en el método createMarker ()? ¿O se bloqueará más tarde, porque no hay ningún icono tp lugar en el mapa?

Sí, sería mejor que arrojara NPE directamente dentro de GoogleMap.addMarker o BitmapDescriptorFactory.fromBitmap , pero no sucederá dentro de su createMapMarker menos que llame a un método en el icon .

No es posible saber por qué es null , porque no hay ningún código relevante en la pregunta, pero sospecho que el proceso se cancela cuando el usuario deja la aplicación y más tarde se vuelve a crear cuando regresan.

Android destruye la aplicación cuando no se utiliza durante mucho tiempo o el sistema operativo necesita memoria. Si guardó sus MarkerOptions en onSaveInstanceState para intentar recrear posteriormente la nota de Marker , el icono de Marker no es Parcelable por lo tanto no se guardará. Usted necesita guardar el icono independientemente como un Bitmap que es Parcelable y al recrear el marcador do addMarker(savedMarkerOptions.icon(bitmap));

Una posibilidad es ver es que mMap se está convirtiendo en nulo en algunos casos cuando ocurre un cambio de orientación mientras su asynctask se está ejecutando. En estos casos cuando se llama a updateSignsInView, mMap todavía está por configurarse y así obtendrás un nullpointer en la línea Marker marker = mMap.addMarker(createMapMarker(mSignArray[i])); Para el resetMap(); que se está llamando antes de esta línea, posiblemente hay un cheque nulo para mMap y por lo tanto no hay error.

¿conectaste el mapa a Fragment en el archivo xml? por ejemplo, mmap = findViewbyId (R.id.map); ?

  • Excepción Java del puntero nulo
  • NullPointerException en findViewById () en android
  • Usando secciones con fragmentos, NullPointerException
  • Puntero nulo en ExpandedView para la búsqueda de ActionBar
  • Convertir objeto nulo en String
  • AQuery (Android Query) Cómo cargar imágenes en realidad
  • Android Fragment getActivity () = nulo
  • ¿Por qué el servicio Android falla con NullPointerException?
  • Android TabHost.addTab -> Excepción de puntero nulo
  • NullPointerException en onLoaderFinished usando SimpleCursorAdapter
  • NullPointerException en SharedPreferences Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.