【问题标题】:Splash Screen disappeared after Application.OnCreate was overridden覆盖 Application.OnCreate 后启动画面消失
【发布时间】:2019-03-03 18:10:23
【问题描述】:

初始问题

我需要在我的Application.OnCreate 方法中注册ProcessLifecycleOwner,如此处Xamarin.Android Architecture Components 所述。

但它导致了6.2.2 版本的MvvmCross 的错误:

MvvmCross.Exceptions.MvxIoCResolveException:发生MvvmCross.ViewModels.IMvxAppStart 类型解析失败

或者只是停留在Splash Screen6.2.3


修复

Xamarin.Android mvvmcross app crashes when launching with intent filter 的建议解决了这些问题。

[Application]
public class App : MvxAndroidApplication<Setup, Core.App>
{
    public App(IntPtr reference, JniHandleOwnership transfer) :
        base(reference, transfer) { }

    public override void OnCreate()
    {
        MvxAndroidSetupSingleton
            .EnsureSingletonAvailable(ApplicationContext)
            .EnsureInitialized();

        base.OnCreate();
    }
}

当前问题

然而Splash Screen也消失了,只剩下default theme的蓝色背景。

我找到的解决方法:

public override void OnCreate()
{
    Task.Run(() => MvxAndroidSetupSingleton
                     .EnsureSingletonAvailable(ApplicationContext)
                     .EnsureInitialized());

    base.OnCreate();
}

但由于并行性,它不可靠,有时有效,有时崩溃。


问题

Splash Screen如何恢复?

【问题讨论】:

  • 首先,我不建议您使用Task,Run(()=&gt;MvxAndroidSetupSingleton)..,MvxAndroidSetupSingleton 可以用来确保框架随时启动并运行,它可能会阻塞您的 UI。如果你使用Task.Run(),你打开一个子线程然后运行MvxAndroidSetupSingleton..,你可以使用Task.Wait()卡在主线程上等待任务完成。
  • 谢谢,但是如果您不推荐使用 MvxAndroidSetupSingleton ,您能解释一下使用什么吗?此外,还为解决方法块 UI 中的任务添加对 .Wait() 的调用。

标签: xamarin.android mvvmcross oncreate


【解决方案1】:

您的方法很可能阻塞了 UI 线程,我们导致 UI 在预期的初始屏幕应该显示的时间内阻塞。

尝试使用异步事件处理程序来允许非阻塞 UI 调用

[Application]
public class App : MvxAndroidApplication<Setup, Core.App> {
    public App(IntPtr reference, JniHandleOwnership transfer) :
        base(reference, transfer) { 
        EnsureInitialized = onEnsureInitialized; //Subscribe to event
    }

    private event EventHandler EnsureInitialized = delegate { };

    private async void onEnsureInitialized(object sender, EventArgs args) {
        await Task.Run(() => MvxAndroidSetupSingleton.EnsureSingletonAvailable(ApplicationContext)
            .EnsureInitialized());
    }

    public override void OnCreate() {
        EnsureInitialized(this, EventArgs.Empty); //Raise event
        base.OnCreate();
    }
}

【讨论】:

  • 谢谢,它有效。但是,你能解释一下为什么要使用event吗?我没有它,只是在我的解决方法中添加了await,它起作用了。
  • @Ghosthack 因为除了事件处理程序,建议避免使用async voidOnCreate 不是事件处理程序。参考Async/Await - Best Practices in Asynchronous Programming
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多