3
votes

I'ver recently upgraded my app to use SKMaps 3.0.2, and everything seemed to work, excpet that when my activity ("ViewLocationActivity"), which calls a Fragment which extends android.support.v4.app.Fragment ("NewMapFragment") is restarted after, say, being in the background for some time, and the onStart() method is called, the Fragment fails to inflate the SKMapViewHolder and crashes. I've attached the log, but it appears the reason for this is the line which states

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.skobbler.ngx.map.SKMapViewStyle.getStyleFileName()' on a null object reference at com.skobbler.ngx.map.SKMapViewHolder.a(SourceFile:254)

This did not occur in the previous SDK version and is especially weird since it does not happen when first loading the Fragment, but only in subsequent restarts, when onStart() is being called.

Relevant code snippets

@Override
public void onStart() // In ViewLocationActivity {
    super.onStart();
    Intent intent = new Intent(this, LocationService.class);
    bindService(intent, mConnection, BIND_AUTO_CREATE);
}



public void onCreate(Bundle savedInstanceState) // in NewMapFragment {
    super.onCreate(savedInstanceState);
    Methods.initializeSKMaps(getActivity());        
    locationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
    registerLocationListener();
    SKCurrentPositionProvider currentPositionProvider = new SKCurrentPositionProvider(getActivity());
    currentPositionProvider.setCurrentPositionListener(this);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) // in NewMapFragment {
    // App crashes in this line
    mView = inflater.inflate(R.layout.fragment_new_map, container, false);
    mapHolder = (SKMapViewHolder)mView.findViewById(R.id.map_surface_holder);
    mapHolder.setMapSurfaceListener(this);
    initializeControlButtons();
    initializeBottomSheet();
    return mView;
}

    <!-- fragment_new_map -->
<android.support.design.widget.CoordinatorLayout
    android:id="@+id/skobbler_map_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <com.skobbler.ngx.map.SKMapViewHolder
        android:id="@+id/map_surface_holder"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
    <include layout="@layout/map_control_layout"
        android:id="@+id/map_control_layout"/>
</android.support.design.widget.CoordinatorLayout>

Logcat:

01-23 20:40:51.548 19453-19453/com.shay.vagabond E/AndroidRuntime: FATAL EXCEPTION: main Process: com.shay.vagabond, PID: 19453 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shay.vagabond/com.shay.vagabond.Activities.ViewLocationActivity}: android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class com.skobbler.ngx.map.SKMapViewHolder at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Caused by: android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class com.skobbler.ngx.map.SKMapViewHolder Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class com.skobbler.ngx.map.SKMapViewHolder Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:430) at android.view.LayoutInflater.createView(LayoutInflater.java:645) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:787) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) at android.view.LayoutInflater.rInflate(LayoutInflater.java:858) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821) at android.view.LayoutInflater.inflate(LayoutInflater.java:518) at android.view.LayoutInflater.inflate(LayoutInflater.java:426) at com.shay.vagabond.Fragments.NewMapFragment.onCreateView(NewMapFragment.java:155) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1277) at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2154) at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201) at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:603) at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181) at com.shay.vagabond.Activities.ViewLocationActivity.onStart(ViewLocationActivity.java:691) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248) at android.app.Activity.performStart(Activity.java:6681) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.skobbler.ngx.map.SKMapViewStyle.getStyleFileName()' on a null object reference at com.skobbler.ngx.map.SKMapViewHolder.a(SourceFile:254) at com.skobbler.ngx.map.SKMapViewHolder.(SourceFile:159) at java.lang.reflect.Constructor.newInstance0(Native Method)  at java.lang.reflect.Constructor.newInstance(Constructor.java:430)  at android.view.LayoutInflater.createView(LayoutInflater.java:645)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:787)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)  at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)  at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)  at android.view.LayoutInflater.inflate(LayoutInflater.java:518)  at android.view.LayoutInflater.inflate(LayoutInflater.java:426)  at com.shay.vagabond.Fragments.NewMapFragment.onCreateView(NewMapFragment.java:155)  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1277)  at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2154)  at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)  at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:603)  at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181)  at com.shay.vagabond.Activities.ViewLocationActivity.onStart(ViewLocationActivity.java:691)  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)  at android.app.Activity.performStart(Activity.java:6681)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6077)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

2

2 Answers

1
votes

I don't know if this is an ideal solution, but since I got no answer as to what might cause this behavior in the Skobbler SDK, I've managed to solve this issue by simply removing the problematic Fragment, which inflates and contains the SKMapsViewHolder, from the backstack when calling onCreate() (which is invoked if the process is destroyed by the OS). This forces the Activity to re-initialize & recreate the Fragment, which seems to solve the problem. Hope it helps someone at some point

    private void initializeViews() {
    // Setting the pre-arrival layout
    setContentView(R.layout.view_location_layout);
    initializeNavigationDrawer();
    initializeBottomSheet();
    initializeProgressBar();
    removeAllFragments();
}

private void removeAllFragments() {
    while (fragmentManager.getBackStackEntryCount() > 0)
        fragmentManager.popBackStackImmediate();
}
0
votes

This problem has been fixed and the fix will be available in the next SKMaps release version.