Ошибка трассировки Android в SKMaps в OnStart() в Activity

Недавно я обновил свое приложение для использования SKMaps 3.0.2, и все, казалось, работало, за исключением того, что моя активность ("ViewLocationActivity"), которая вызывает фрагмент, который расширяет android.support.v4.app.Fragment ("NewMapFragment") перезапускается после, скажем, нахождения в фоновом режиме в течение некоторого времени, и вызывается метод onStart(), фрагмент не может заполнить SKMapViewHolder и вылетает. Я приложил журнал, но кажется, что причина этого - строка, которая заявляет

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)

Это не происходило в предыдущей версии SDK и особенно странно, поскольку это не происходит при первой загрузке фрагмента, а только при последующих перезапусках, когда вызывается onStart().

Соответствующие фрагменты кода

@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: ОСНОВНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: com.shay.vagabond, PID: 19453 java.lang.RuntimeException: Невозможно запустить действие ComponentInfo{com.shay.vagabond/com.shay.vagabond.Activities.ViewLocationActivity}: android.view.InflateException: строка двоичного XML-файла #7: строка № двоичного XML-файла: ошибка надувания класса com.skobbler.ngx.map.SKMapViewHolder в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) в android.app.ActivityThread.-wrap12(ActivityThread.java) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) в android.os.Handler.dispatchMessage(Handler.java:102) в android.os.Looper.loop(Looper.java:154) в android.app.ActivityThread.main(ActivityThread.java):6077) на java.lang.reflect.Method.invoke(собственный метод) на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Вызывается: android.view.InflateException: строка двоичного файла XML № 7: строка двоичного файла XML № 7: ошибка надувания класса com.skobbler.ngx.map.SKMapViewHolder Причина by: android.view.InflateException: строка двоичного XML-файла #7: ошибка надувания класса com.skobbler.ngx.map.SKMapViewHolder Вызывается: java.lang.reflect.InvocationTargetException в java.lang.reflect.Constructor.newInstance0(собственный метод) в java.lang.reflect.Constructor.newInstance(Constructor.java:430) в android.view.LayoutInflater.createView(LayoutInflater.java:645) в android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:787).view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) в android.view.LayoutInflater.rInflate(LayoutInflater.java:858) в android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821. and at. раздувать (LayoutInflater.java:518) на android.view.LayoutInflater.inflate(LayoutInflater.java:426) на com.shay.vagabond.Fragments.NewMapFragment.onCreateView(NewMapFragment.java:155) в android.support.v4.app.Fragment.performCreateView(Fragment.java:2087) в android.support.v4.app.FragmentManagerImpl.mjageManager.mpj.mgmentMoager (:1113) в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1277) в android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2154) в android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201) в android.support.v4.app.FragmentActivity.on.jj ().support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181) в com.shay.vagabond.Activities.ViewLocationActivity.onStart(ViewLocationActivity.java:691) в android.app.Instrumentation.callActivityOnStart: 12. Instrumentation) в android.app.Activity.performStart(Activity.java:6681) в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) в android.app.ActivityThread.-wrap12(ActivityThread.java) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1460) на android.os.Handler.dispatchMessage(Handler.java:102) на android.os.Looper.loop(Looper.java:154) на android.app.ActivityThread.main(ActivityThread.java:6077) в java.lang.reflect.Method.invoke(собственный метод) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java: 755) Причина: java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String com.skobbler.ngx.map.SKMapViewStyle.getStyleFileName()' для ссылки на пустой объект в com.skobbler.ngx..map.SKMapViewHolder.a(SourceFile:254) в com.skobbler.ngx.map.SKMapViewHolder.(SourceFile:159) в java.lang.reflect.Constructor.newInstance0(собственный метод) в java.lang.reflect.Co nstructor.newInstance (Constructor.java:430) в android.view.LayoutInflater.createView(LayoutInflater.java:645) в android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:787) в android.view.LayoutInflater (LayoutInflater (LayoutInflater)..java: 727) на android.view.LayoutInflater.rInflate(LayoutInflater.java:858) на android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821) на android.view.LayoutInflater.inflate (LayoutInflater.j: на android.view.LayoutInflater.inflate(LayoutInflater.java:426) на com.shay.vagabond.Fragments.NewMapFragment.onCreateView(NewMapFragment.java:155) на android.support.v4.app.Fragment.performCreateView (Fragment: 2087) в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) в android.support.v4.app. FragmentManagerImpl.moveToState (FragmentManager.java:1277) в android.support.v4.app.FragmentManagerImpl.dispatchActivityC разработано (FragmentManager.java:2154) в android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201) в android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:603) в android.supp.v7.app.AppCompatActivity.onStart (AppCompatActivity.java:181) в com.shay.vagabond.Activities.ViewLocationActivity.onStart(ViewLocationActivity.java:691) в android.app.Instrumentation.callActivityOnStart(Instrumentation.java:12) android.app.Activity.performStart(Activity.java:6681) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2609) в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) в android.app.ActivityThread.-wrap12(ActivityThread.java) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1460) в android.os.Handler.dispatchMessage(Handler.java:102) в android.os.Looper.loop (Looper.java: 154) на android.app.ActivityThread.main(ActivityThread.java:6077) на java.lang.reflect.Method.invoke(Na метод) на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:755)

2 ответа

Решение

Я не знаю, является ли это идеальным решением, но так как я не получил ответа относительно того, что может вызвать такое поведение в Skobbler SDK, мне удалось решить эту проблему, просто удалив проблемный фрагмент, который раздувает и содержит SKMapsViewHolder, из backstack при вызове onCreate() (который вызывается, если процесс уничтожен ОС). Это вынуждает Activity повторно инициализировать и воссоздавать фрагмент, что, похоже, решает проблему. Надеюсь, это поможет кому-то в какой-то момент

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

Эта проблема была исправлена, и исправление будет доступно в следующей версии SKMaps.

Другие вопросы по тегам