Заставка исчезла после Application.OnCreate был переопределен - PullRequest
0 голосов
/ 03 марта 2019

Первоначальный выпуск

Мне нужно зарегистрировать ProcessLifecycleOwner, как описано здесь Компоненты архитектуры Xamarin.Android в моем Application.OnCreate методе.

Но это привело к ошибке с 6.2.2 версией MvvmCross:

MvvmCross.Exceptions.MvxIoCResolveException: не удалось разрешить тип MvvmCross.ViewModels.IMvxAppStart произошла

или просто застрял на Splash Screen с 6.2.3.


Fix

Эти проблемы были исправлены по совету Xamarin.Android mvvmcross при запуске приложения при запускес фильтром намерений .

[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.

Обходной путь Iнашел:

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

    base.OnCreate();
}

Но из-за параллелизма он ненадежен, иногда работает, иногда падает.


Вопрос

Как Splash Screen может бытьвосстановлена?

1 Ответ

0 голосов
/ 04 марта 2019

Ваш подход, скорее всего, заключается в блокировке потока пользовательского интерфейса, который заставляет пользовательский интерфейс блокироваться в то время, когда предполагается показ ожидаемого заставки.

Попробуйте использовать обработчик асинхронных событий, чтобы неблокировка вызова интерфейса пользователя

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