3

我最近升级了我的应用程序以使用 SKMaps 3.0.2,一切似乎都正常工作,除了我的活动(“ViewLocationActivity”),它调用了一个扩展 android.support.v4.app.Fragment 的片段(“NewMapFragment” ) 在后台运行一段时间后重新启动,并且调用 onStart() 方法,Fragment 无法为 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 版本中没有发生,并且特别奇怪,因为它在第一次加载 Fragment 时不会发生,但只会在随后的重新启动时发生,当 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>

日志猫:

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 文件第 7 行:在 android 上膨胀类 com.skobbler.ngx.map.SKMapViewHolder 时出错。 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(Native Method) 在 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 引起:android.view.InflateException:二进制 XML 文件第 7 行:膨胀类 com.skobbler.ngx.map.SKMapViewHolder 时出错 原因:java.lang.reflect.Constructor.newInstance0(本地方法)处 java.lang.reflect 处的 java.lang.reflect.InvocationTargetException。 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:787) 上 android.view.LayoutInflater.createView(LayoutInflater.java:645) 上的 Constructor.newInstance(Constructor.java:430)。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) 在 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.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.dispatchActivityCreated(FragmentManager.java:2154) 在 android.support.v4.app。FragmentController.dispatchActivityCreated(FragmentController.java:201) 在 android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:603) 在 android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181) 在 com .shay.vagabond.Activities.ViewLocationActivity.onStart(ViewLocationActivity.java:691) 在 android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248) 在 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) 在 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()' 在 java.lang.reflect 的 com.skobbler.ngx.map.SKMapViewHolder.(SourceFile:159) 的 com.skobbler.ngx.map.SKMapViewHolder.a(SourceFile:254) 的空对象引用上。 android.view.LayoutInflater.createView(LayoutInflater.java:645) 的 java.lang.reflect.Constructor.newInstance(Constructor.java:430) 的 Constructor.newInstance0(Native Method) android.view.LayoutInflater.createViewFromTag(LayoutInflater.爪哇:787) 在 android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:858) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)。 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) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java :1295) 在 android.support.v4.app.FragmentManagerImpl 的 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1277)。dispatchActivityCreated(FragmentManager.java:2154) 在 android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201) 在 android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:603) 在 android.support .v7.app.AppCompatActivity.onStart(AppCompatActivity.java:181) 在 com.shay.vagabond.Activities.ViewLocationActivity.onStart(ViewLocationActivity.java:691) 在 android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248) 在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.os.Handler 的 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)。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方法)在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

4

2 回答 2

1

我不知道这是否是一个理想的解决方案,但由于我没有得到关于在 Skobbler SDK 中可能导致此行为的原因的答案,我设法通过简单地删除有问题的 Fragment 来解决这个问题,该 Fragment 膨胀并包含SKMapsViewHolder,在调用 onCreate() 时来自 backstack(如果进程被操作系统销毁,则会调用它)。这迫使 Activity 重新初始化并重新创建 Fragment,这似乎解决了问题。希望它在某个时候对某人有所帮助

    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();
}
于 2017-01-27T10:47:33.517 回答
0

此问题已得到修复,该修复将在下一个 SKMaps 发布版本中提供。

于 2017-02-04T17:56:59.943 回答