首页 > 解决方案 > 当应用程序进入后台并打开 OnBoarding 时出现 NullPointerException

问题描述

我的 Xamarin.Android 应用程序有一个从 MainActivity 开始的 OnBoarding 进程。每次我最小化应用程序并尝试再次启动它时,我都会在输出中显示 NullPointerException 并且我找不到根本原因。

10-30 13:52:59.102 W/System.err(23618): java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getVisibility()' on a null object reference
10-30 13:52:59.102 W/System.err(23618):     at android.view.ViewRootImpl.getHostVisibility(ViewRootImpl.java:1809)
10-30 13:52:59.102 W/System.err(23618):     at android.view.ViewRootImpl.handleAppVisibility(ViewRootImpl.java:1445)
10-30 13:52:59.102 W/System.err(23618):     at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:4841)
10-30 13:52:59.102 W/System.err(23618):     at android.os.Handler.dispatchMessage(Handler.java:106)
10-30 13:52:59.103 W/System.err(23618):     at android.os.Looper.loop(Looper.java:214)
10-30 13:52:59.103 W/System.err(23618):     at android.app.ActivityThread.main(ActivityThread.java:7078)
10-30 13:52:59.103 W/System.err(23618):     at java.lang.reflect.Method.invoke(Native Method)
10-30 13:52:59.103 W/System.err(23618):     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
10-30 13:52:59.103 W/System.err(23618):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
10-30 13:53:01.421 W/ActivityThread(23618): handleWindowVisibility: no activity for token android.os.BinderProxy@177ac90
10-30 13:53:01.473 I/DecorView(23618): createDecorCaptionView >> DecorView@a2ae0c1[], isFloating: false, isApplication: true, hasWindowDecorCaption: false, hasWindowControllerCallback: true

OnBoarding 是使用 AppIntro 类创建的,它是从 MainActivity 调用的,如下所示:

 private bool CanOpenOnBoarding()
        {
            var getPrefs = PreferenceManager.GetDefaultSharedPreferences(BaseContext);
            bool isFirstStart = getPrefs.GetBoolean(AppDetails.ShowOnboarding, true);
            if (isFirstStart)
            {
                StartActivity(new Intent(this, typeof(OnBoarding)));
                Finish();
                return true;
            }

            return false;
        }

MainActivity 的 OnCreate 是:

 protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            MainViewModel.PropertyChanged += OnProprietyChanged;

            Presenter = (CustomPresenter) Mvx.IoCProvider.Resolve<IMvxAndroidViewPresenter>();
            Presenter.RegisterFragmentManager(FragmentManager);

            var appService = Mvx.IoCProvider.Resolve<IApplicationService>();
            appService.InitializeDbAsync().ConfigureAwait(false).GetAwaiter().GetResult();

            MainViewModel.CheckForConnectivityAsync();

            if (CanOpenOnBoarding())
            {
                return;
            }

            TabHost = FindViewById<TabHost>(global::Android.Resource.Id.TabHost);
            TabHost.TabWidget.SetDividerDrawable(null);
            TabHost.Setup();

            //leave them without Await
            MainViewModel.DisplayTermsAndConditionsModalAsync();
        }

其他生命周期未命中(OnResume、OnPause)。每次我恢复应用程序时,我都会导航到 MainActivity 的 OnCreate 方法,在这里我将再次启动 OnBoarding Activity。

该应用程序没有崩溃,我可以从“最近的应用程序”中看到它。如何找到并修复 NullPointerException 的根本原因?

标签: androidxamarin.androidmvvmcross

解决方案


推荐阅读