Xamarin 初始屏幕示例在 phone 的横向模式下不起作用。如何解决?
Xamarin Splash screen example does not work in landscape mode on a phone. How to fix it?
我从 Xamarin 网站下载了启动画面示例:
http://developer.xamarin.com/guides/android/user_interface/creating_a_splash_screen/
我编译了它并 运行 它在我的 phone 上:
http://www.gsmarena.com/samsung_galaxy_fresh_s7390-5841.php
在纵向模式(垂直)下握住我的 phone 时工作正常。启动画面变得直接可见,几秒钟后,带有按钮的视图变得可见。关闭并重新启动应用程序时,它仍然可以正常工作。
之后,我再次将其关闭并将 phone 保持在横向(水平)模式。现在,我再次启动了该应用程序。我的 phone 被冻结了几秒钟,飞溅没有变得可见。之后,我用按钮看到了我的视图。
当您尝试重现此问题时,请确保您:
- 不要尝试在虚拟设备上重现它(行为不同)。
- 确保睡眠至少需要 10 秒,然后您才能真正了解问题所在:冻结的应用程序而不是启动画面。
- 如果你没有三星Trend Lite,你换个小智能试试phone。我很难想象这可能是一个 "Samsung Trend Lite only" 问题。
我该如何解决这个问题?
您链接的 Xamarin sample 有很大问题:
[Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
Thread.Sleep(10000); // Simulate a long loading process on app startup.
StartActivity(typeof(Activity1));
}
}
Activity
的OnCreate()
方法在UI线程上执行,因此在其中调用Thread.Sleep()
会锁定主线程,可能会生成一个Application未响应 (ANR) 显示给用户。
这是 Xamarin 文档中的错误,您 不应该 运行 UI 线程上的 Thread.Sleep()
,尤其是在其中一个线程中activity.
的核心生命周期回调
通过使用后台线程执行休眠然后回调启动画面 activity 启动下一个 activity:
来解决此问题
[Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
System.Threading.Tasks.Task.Run( () => {
Thread.Sleep(10000); // Simulate a long loading process on app startup.
StartActivity(typeof(Activity1));
});
}
}
我刚刚发现了另一个解决方案。使用计时器有点奇怪,但它解决了问题。
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
System.Timers.Timer t = new System.Timers.Timer(1);
t.Elapsed += (o, e) =>
{
t.Stop();
Thread.Sleep(10000); // Simulate a long loading process on app startup.
StartActivity(typeof(Activity1));
};
t.Start();
}
我从 Xamarin 网站下载了启动画面示例: http://developer.xamarin.com/guides/android/user_interface/creating_a_splash_screen/
我编译了它并 运行 它在我的 phone 上: http://www.gsmarena.com/samsung_galaxy_fresh_s7390-5841.php
在纵向模式(垂直)下握住我的 phone 时工作正常。启动画面变得直接可见,几秒钟后,带有按钮的视图变得可见。关闭并重新启动应用程序时,它仍然可以正常工作。
之后,我再次将其关闭并将 phone 保持在横向(水平)模式。现在,我再次启动了该应用程序。我的 phone 被冻结了几秒钟,飞溅没有变得可见。之后,我用按钮看到了我的视图。
当您尝试重现此问题时,请确保您:
- 不要尝试在虚拟设备上重现它(行为不同)。
- 确保睡眠至少需要 10 秒,然后您才能真正了解问题所在:冻结的应用程序而不是启动画面。
- 如果你没有三星Trend Lite,你换个小智能试试phone。我很难想象这可能是一个 "Samsung Trend Lite only" 问题。
我该如何解决这个问题?
您链接的 Xamarin sample 有很大问题:
[Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
Thread.Sleep(10000); // Simulate a long loading process on app startup.
StartActivity(typeof(Activity1));
}
}
Activity
的OnCreate()
方法在UI线程上执行,因此在其中调用Thread.Sleep()
会锁定主线程,可能会生成一个Application未响应 (ANR) 显示给用户。
这是 Xamarin 文档中的错误,您 不应该 运行 UI 线程上的 Thread.Sleep()
,尤其是在其中一个线程中activity.
通过使用后台线程执行休眠然后回调启动画面 activity 启动下一个 activity:
来解决此问题[Activity(Theme = "@style/Theme.Splash", MainLauncher = true, NoHistory = true)]
public class SplashActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
System.Threading.Tasks.Task.Run( () => {
Thread.Sleep(10000); // Simulate a long loading process on app startup.
StartActivity(typeof(Activity1));
});
}
}
我刚刚发现了另一个解决方案。使用计时器有点奇怪,但它解决了问题。
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
System.Timers.Timer t = new System.Timers.Timer(1);
t.Elapsed += (o, e) =>
{
t.Stop();
Thread.Sleep(10000); // Simulate a long loading process on app startup.
StartActivity(typeof(Activity1));
};
t.Start();
}