#xamarin #xamarin.forms #xamarin.android #android-context
Вопрос:
Мой экран-заставка-анимация Лотти, во время 3-секундной анимации я пытаюсь инициализировать все, что могу, в фоновом потоке, поэтому я включил в это новое действие все, что можно, от MainActivity до метода LoadApplication, просто хотел поместить все, что могу, во время анимации всплеска
вот мой класс занятий по всплеску
[Activity(Label = "MyName", Theme = "@style/MyName.Splash", MainLauncher = true, NoHistory = true)] public class SplashActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IAnimatorListener { private Com.Airbnb.Lottie.LottieAnimationView animationView; public void OnAnimationCancel(Animator animation) { } public void OnAnimationEnd(Animator animation) { //StartActivity(new Intent(Application.Context, typeof(MainActivity))); StartActivity(new Intent(this, typeof(MainActivity))); Finish(); //if I remove this I got 1-2 sec white screen } public async void OnAnimationStart(Animator animation) { await Task.Run(() =gt; { Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); global::Xamarin.Forms.FormsMaterial.Init(this, savedInstanceState); OneSignal.Current.StartInit(API_KEY).InFocusDisplaying(OSInFocusDisplayOption.Notification).EndInit(); FFImageLoading.Forms.Platform.CachedImageRenderer.Init(enableFastRenderer: true); Rg.Plugins.Popup.Popup.Init(this); // ------ this became problem MainActivity.AppInstance = new App(); //even create Xam App here but don't show it yet }); } protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.SplashLayout); animationView = FindViewByIdlt;Com.Airbnb.Lottie.LottieAnimationViewgt;(Resource.Id.animation_view); animationView.AddAnimatorListener(this); } }
Я помещаю методы инициализации в фоновый поток, потому что, если он находится в основном потоке, моя анимация не является текучей. После окончания анимации я начинаю основное действие и показываю свое приложение
основной код деятельности
[Activity(Label = "MyName", Icon = "@mipmap/ic_launcher", Theme = "@style/MainTheme", MainLauncher = false, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { public static App AppInstance; //Xamarin App instance created on splash activity protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); LoadApplication(AppInstance); AppInstance.Show(); //just setting MainPage = new AppShell(); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); } }
все работает нормально, кроме плагина Rg
если я перейду Rg.Plugins.Popup.Popup.Init(this);
к основной деятельности, то это сработает.
Итак, мой вопрос в том, правильно ли я инициализирую библиотеки для конкретной платформы в splash activity, и я понимаю, почему не работает только плагин Rg, который я вижу в init, он запрашивает контекст так же, как и другие библиотеки, поэтому я инициализировал его с this
помощью ключевого слова и начал основную деятельность с this
ключевого слова
Должен ли я сделать это каким-то другим способом, инициализировать библиотеки во время воспроизведения анимации, потому что каждая секунда имеет значение при запуске приложения.
Контекст, в котором создается основное действие, отличается ли оно от действия всплеска? Я даже попытался заменить все this
на Application.Context
Комментарии:
1. «потому что каждая секунда имеет значение, когда вы запускаете приложение». — Но каждая миллисекунда, не так много. Когда вы устанавливаете время вызовов до и после этой строки инициализации, сколько проходит миллисекунд?
2. @ToolmakerSteve при проверке с помощью класса секундомера все, что работает во время моей анимации в фоновом режиме, заняло 2379 мс (основная активность. AppInstance = новое приложение() ) составляет 1600 мс, поэтому я перенес инициализацию приложения Xamarin в фоновый поток во время работы анимации
3. Да, конечно. Так что перемещение всего этого барахла имело смысл. Но Инициализация, о которой вы спрашиваете, заняла сколько из этого? Мое предположение составляет 1 или 2 мс. Это достаточно легко для вас выяснить. При необходимости вызовите его ЕЩЕ РАЗ в Основной деятельности — я думаю, вы сможете сделать это без проблем (хотя я еще не тестировал).
4. @ToolmakerSteve да, я согласен, и я перенес его в основное действие, и его работа похожа на несколько мс, но мой вопрос был в том, почему это не работает, что случилось с контекстом, и, возможно, некоторые другие библиотеки не будут работать, как OneSingal или, может быть, FFImageLoadingForms тоже … вы предлагаете включить все в основную деятельность, кроме нового приложения() ?
5. Теперь я понимаю. Я бы сделал в точности то же, что и вы, — только изложил бы в Основном то, что, кажется, имеет значение. Его достаточно легко сделать
public const bool OPTIMIZE_STARTUP = true;
, когда ложно, пусть он делает все в основном. Поэтому, если вы подозреваете проблему, вы можете легко определить, произошло ли это из-за перемещения этого материала.