Android Xamarin闪屏示例在手机的横向模式下不起作用。如何修复它?

Android Xamarin闪屏示例在手机的横向模式下不起作用。如何修复它?,android,xamarin,splash-screen,Android,Xamarin,Splash Screen,我从Xamarin网站下载了闪屏示例: 我编译并在手机上运行了它: 在纵向模式(垂直)下拿着手机时,它工作正常。启动屏幕变得直接可见,几秒钟后,带有按钮的视图变得可见。当关闭并重新启动应用程序时,它仍然可以正常工作 之后,我再次关闭手机,并将手机保持在横向(水平)模式。现在,我再次启动了应用程序。我的手机冻结了几秒钟,溅起的水花看不见了。在那之后,我用按钮看到了我的观点 当您试图重现此问题时,请确保: 不要试图在虚拟设备上复制它(行为不同) 确保睡眠至少需要10秒钟,然后你才能真正看到问题

我从Xamarin网站下载了闪屏示例:

我编译并在手机上运行了它:

在纵向模式(垂直)下拿着手机时,它工作正常。启动屏幕变得直接可见,几秒钟后,带有按钮的视图变得可见。当关闭并重新启动应用程序时,它仍然可以正常工作

之后,我再次关闭手机,并将手机保持在横向(水平)模式。现在,我再次启动了应用程序。我的手机冻结了几秒钟,溅起的水花看不见了。在那之后,我用按钮看到了我的观点

当您试图重现此问题时,请确保:

  • 不要试图在虚拟设备上复制它(行为不同)
  • 确保睡眠至少需要10秒钟,然后你才能真正看到问题所在:一个冻结的应用程序而不是启动屏幕
  • 如果您没有三星Trend Lite,可以在另一款小型智能手机上试用。我发现很难想象这会是一个“仅限三星趋势Lite”的问题
如何解决此问题?

您链接的文件中有一个大问题:

[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));
    }
}
活动的
OnCreate()
方法在UI线程上执行,因此调用
线程。其中的Sleep()
将锁定主线程,可能会生成一个应用程序无响应(ANR)以显示给用户

这是Xamarin文档中的错误,不应在UI线程上运行
Thread.Sleep()
,尤其是在活动的一个核心生命周期回调中

通过使用后台线程执行睡眠,然后回调splash活动以启动下一个活动来修复此问题:

[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));
        });
    }
}
您链接的文件中有一个大问题:

[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));
    }
}
活动的
OnCreate()
方法在UI线程上执行,因此调用
线程。其中的Sleep()
将锁定主线程,可能会生成一个应用程序无响应(ANR)以显示给用户

这是Xamarin文档中的错误,不应在UI线程上运行
Thread.Sleep()
,尤其是在活动的一个核心生命周期回调中

通过使用后台线程执行睡眠,然后回调splash活动以启动下一个活动来修复此问题:

[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));
        });
    }
}
您链接的文件中有一个大问题:

[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));
    }
}
活动的
OnCreate()
方法在UI线程上执行,因此调用
线程。其中的Sleep()
将锁定主线程,可能会生成一个应用程序无响应(ANR)以显示给用户

这是Xamarin文档中的错误,不应在UI线程上运行
Thread.Sleep()
,尤其是在活动的一个核心生命周期回调中

通过使用后台线程执行睡眠,然后回调splash活动以启动下一个活动来修复此问题:

[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));
        });
    }
}
您链接的文件中有一个大问题:

[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));
    }
}
活动的
OnCreate()
方法在UI线程上执行,因此调用
线程。其中的Sleep()
将锁定主线程,可能会生成一个应用程序无响应(ANR)以显示给用户

这是Xamarin文档中的错误,不应在UI线程上运行
Thread.Sleep()
,尤其是在活动的一个核心生命周期回调中

通过使用后台线程执行睡眠,然后回调splash活动以启动下一个活动来修复此问题:

[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();
    }

我刚刚发现了另一个解决方案。使用计时器有点奇怪,但它解决了问题

    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();
    }

我刚刚发现了另一个解决方案。使用计时器有点奇怪,但它解决了问题

    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();
    }

我刚刚发现了另一个解决方案。使用计时器有点奇怪,但它解决了问题

    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();
    }

您确定不应该在UI线程上执行此操作吗?这也解决了我设备上的问题(我刚刚发现):base.OnCreate(bundle);System.Timers.Timer t=新的System.Timers.Timer(1);t、 运行时间+=(o,e)=>{t.Stop();Thread.Sleep(10000);//在应用程序启动时模拟一个长的加载过程;t、 Start();这与使用后台线程差不多。这也是一个很好的解决方案!作为对将睡眠放入后台线程的回应,请尝试按照Xamarin文档建议的方式保持睡眠,并在应用程序启动时按下后退按钮退出应用程序。因为它在UI线程上,所以它将锁定用户交互,并可能生成ANR。因此,为什么要将延迟转移到后台。您确定不应该在UI线程上执行吗?这也解决了我设备上的问题(我刚刚发现):base.OnCreate(bundle);System.Timers.Timer t=新的System.Timers.Timer(1);t、 运行时间+=(o,e)=>{t.Stop();Thread.Sleep(10000);//在应用程序启动时模拟一个长的加载过程;t、 Start();这与使用后台线程差不多。这也是一个很好的解决方案!作为对将睡眠放入后台线程的回应,请尝试按照Xamarin文档建议的方式保持睡眠,并在应用程序启动时按下后退按钮退出应用程序。因为它在UI线程上,所以它将锁定用户交互,并可能生成ANR。因此wh