Xamarin Forms — Android — инициализация библиотек в активности splash (перед основной активностью)

#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; , когда ложно, пусть он делает все в основном. Поэтому, если вы подозреваете проблему, вы можете легко определить, произошло ли это из-за перемещения этого материала.