【问题标题】:Xamarin forms App() gets called twice on startupXamarin 表单 App() 在启动时被调用两次
【发布时间】:2015-12-03 10:56:00
【问题描述】:

我的 Xamarin Forms 应用程序有问题。每次我启动 android 解决方案时,App() 构造函数都会被调用两次。我通过将应用入口点设为单例来解决此问题。

但是每个视图构造函数也会被调用两次,我不知道为什么?

这是一个错误吗?

我应该提到,我已经在后面的代码中编写了所有视图 - 如果它以某种方式相关 - 我正在使用 genymotion 模拟器。

App 中的代码没什么花哨的:

bool isInitialized = false;
    public App()
    {
        if (!isInitialized)
        {
            isInitialized = true;

        navigationPage = new NavigationPage(new LoginView());
        MainPage = NavigationPage;
        Observer = new NetworkObserver();
        Debug.WriteLine("Observer initialized");
       }
    }

android 解决方案中的代码 - 我在这里没有更改任何内容:

    [Activity(Label = "XamarinClients", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
        public class MainActivity : 

global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());
        }

    }

在测试 IOS 应用程序后,我可以看到我有同样的问题,它也调用 App() 两次 - 以及页面构造函数。

【问题讨论】:

  • 向我们展示一些您的初始化代码(您在其中调用 Forms.Init())。
  • 找不到 Forms.Init().. 你的意思是 App() 吗?
  • 尝试在 App() 构造函数中放置一个断点,并在第一个和第二个断点命中期间从调试器检查调用堆栈。在此处发布调用堆栈,以便我们提供更多帮助。
  • 你说你两次进入构造函数。我怀疑调用堆栈第一次和第二次不一样。我让你把它们都贴出来,因为我想比较它们。你能在这两种情况下发布调用堆栈吗?此外,在发布之前,右键单击调用堆栈并选中“显示外部代码”复选框。我想这会给我们一个线索......
  • 抱歉,我可能错过了什么。您添加了屏幕截图,但它们都来自您程序中的不同行。你说你的应用程序进入 App() 的构造函数,然后执行一些其他代码,然后再次进入它。尝试在 App() 构造函数的开头只放置一个断点,然后对堆栈进行截图。然后继续执行,等待第二次进入构造函数,再次对栈进行截图。您看到这些屏幕截图之间的区别了吗?它们完全一样吗?一定有区别 - 应用程序只有一个流程!

标签: c# android xamarin


【解决方案1】:

我有完全相同的问题。 App() 从 Xamarin Forms 启动两次。我希望这在较新的 Xamarin Forms 版本中得到修复。对我来说,这个问题始于 2017 年 3 月至 2017 年 6 月之间发布的 Xamarin Forms 版本。旧版本没有做到这一点,在 5/2016 - 7/2016 发布的 Xamarin Forms 版本运行良好。没有发生代码更改。

【讨论】:

  • 我做到了。问题在于从导航堆栈中删除页面。它终止了导航并使其跳回到应用程序的开头。我还发现导航中的任何错误每次都会将应用程序踢回主导航页面。
【解决方案2】:

我遇到了同样的问题,这导致了很多问题,因为它最终会访问我的 API 服务器两次。最终我找到了这个来源:https://www.xamarinhelp.com/xamarin-forms-async-task-startup/,它声明将 async Task 放在 OnStart 方法中(并且显然使 OnStart 异步)。将函数移至 OnStart 方法后,我的双重调用问题就消失了。

【讨论】:

    【解决方案3】:

    如果其他人犯了我刚刚犯的同样愚蠢的错误,请检查以确保您没有同时在两个不同的平台上进行调试。

    我将我的解决方案设置为具有多个启动项目,因此我同时部署到 iOS 和 Android。我只关注我的 Android 设备,所以我什至没有注意到我旁边的 iPhone 上启动的应用程序。

    这解释了为什么我的 App 构造函数被调用了两次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2021-08-01
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多