【发布时间】: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() 构造函数的开头只放置一个断点,然后对堆栈进行截图。然后继续执行,等待第二次进入构造函数,再次对栈进行截图。您看到这些屏幕截图之间的区别了吗?它们完全一样吗?一定有区别 - 应用程序只有一个流程!