Сбой в Mapbox SDK после возобновления работы приложения из фонового режима — контекст равен нулю

После возобновления работы моего приложения в фоновом режиме иногда происходит сбой:

#0. Crashed: main
       at com.mapbox.mapboxsdk.annotations.IconFactory.getInstance(IconFactory.java:53)
       at com.mydomain.myapp.manager.MapManager.(MapManager.java:68)
       at com.mydomain.myapp.fragment.HomeFragment.onMapReady(HomeFragment.java:547)
       at com.mapbox.mapboxsdk.maps.MapView$MapCallback.onMapReady(MapView.java:943)
       at com.mapbox.mapboxsdk.maps.MapView$MapCallback.access$1000(MapView.java:908)
       at com.mapbox.mapboxsdk.maps.MapView$MapCallback$1.run(MapView.java:926)
       at android.os.Handler.handleCallback(Handler.java:790)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6494)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

--

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
       at com.mapbox.mapboxsdk.annotations.IconFactory.getInstance(IconFactory.java:53)
       at com.mydomain.myapp.manager.MapManager.(MapManager.java:68)
       at com.mydomain.myapp.fragment.HomeFragment.onMapReady(HomeFragment.java:547)
       at com.mapbox.mapboxsdk.maps.MapView$MapCallback.onMapReady(MapView.java:943)
       at com.mapbox.mapboxsdk.maps.MapView$MapCallback.access$1000(MapView.java:908)
       at com.mapbox.mapboxsdk.maps.MapView$MapCallback$1.run(MapView.java:926)
       at android.os.Handler.handleCallback(Handler.java:790)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6494)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Мой код:

public class HomeFragment implements OnMapReadyCallback {

  MapView mapView;

  @Override View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ...
    mapView.onCreate(savedInstanceState);
    mapView.getMapAsync(this);
    ...
  }

  ...

  @Override public void onMapReady(MapboxMap mapboxMap) {
    ...
    IconFactory iconFactory = IconFactory.getInstance(getContext()); <-- ERROR: CONTEXT IS NULL
    ...   
  }
}

Платформа: Android 7, 8

Версия Mapbox SDK: com.mapbox.mapboxsdk:mapbox-android-sdk:5.1.5@aar, com.mapbox.mapboxsdk:mapbox-android-services:2.1.3@aar

Шаги, чтобы спровоцировать поведение

  1. Открыть приложение
  2. Подождите немного...
  3. Повторно откройте приложение ‹ -- иногда оно вылетает, иногда нет

person JP Lipata    schedule 26.03.2018    source источник


Ответы (1)


Вам нужно обрабатывать события жизненного цикла, когда ваше приложение переходит в фоновый режим — скорее всего, onMapReady запускается после отсоединения фрагмента.

SupportMapFragment предназначен для расширения от него, если вы не можете его использовать, вам следует посмотреть, как он обрабатывает события жизненного цикла, такие как onStop и onDestroyView.

Отн. ="nofollow noreferrer">https://github.com/mapbox/mapbox-gl-native/blob/da7759a273c096117e513b249741355865f9af8e/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/SupportMapFragment.java< /а>

person Chris    schedule 26.03.2018
comment
Мы реализовали все события жизненного цикла, за исключением того, что onDestroy() отсутствовал, возможно, поэтому. Попробуйте. Спасибо! - person JP Lipata; 27.03.2018
comment
@tenprint вы, вероятно, имели в виду onDestroyView() - person Mehdi Karamosly; 18.10.2018