Ошибка трассировки 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.