我们正在PCL上开发一个跨平台的应用程序,但目前我们只使用Android设备进行测试。
我们担心的是它需要大约6到8秒(取决于我们测试它的设备)来启动应用程序,这非常慢。
在放置几个断点之后,我们看到时间消耗非常均匀
我们注意到这个特定的部分需要更长的时间:
base.OnCreate(bundle);
{li> 1s on global::Xamarin.Forms.Forms.Init(this, bundle);
Page mainPage = new LogScreen();
上的1.5s(创建主页面,然后将其设置为主导航页面)。答案 0 :(得分:4)
这是使用Xamarin.Forms时常见的问题,有很多与此相关的线程特别是这个:
https://forums.xamarin.com/discussion/93178/lets-talk-performance/p6
好消息是Xamarin团队正在研究它。
以下是一些可以改进的提示:
https://blog.xamarin.com/5-ways-boost-xamarin-forms-app-startup-time/
答案 1 :(得分:4)
我建议的第一件事是不对应用程序的调试版本进行基准测试,Mono运行时和Jit'd代码的代码路径与发布版本,共享运行时的使用,程序集大小等不同等等都将影响启动和执行时间。
以下是使用内部基准测试程序(有条件编译,未注入,并使用操作系统的系统)在高端和低端设备上“非常大”积极调整的基于Android Forms的应用程序启动时间的示例时钟)。
MainActivity
上基于主题的启动会添加:
通过重新启动设备的shell脚本生成时间,监视启动以等待系统结算,启动一系列应用程序(GApps,Facebook,Instagram,Twitter等等),等待系统解决,然后通过以下方式启动Forms应用程序:
export deviceTime=$(echo "$(adb -s $deviceID shell cat /proc/uptime | awk '{print $1}') * 1000" | bc -l)
adb -s $deviceID shell am start -n com.sushihangover.GeneticCancerDNAMapper/com.sushihangover.GeneticCancerDNAMapper.DevOpsDashboard --el startTime ${deviceTime%.*}
I GeneticCancerDNAMapper: 0.162 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnCreate
I GeneticCancerDNAMapper: 0.164 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.SetTheme
I GeneticCancerDNAMapper: 0.201 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.OnCreate
I GeneticCancerDNAMapper: 0.244 : Xamarin.Forms.Forms.Init
I GeneticCancerDNAMapper: 0.266 : Realms.Realm.GetInstanceAsync ~Get Instance & Data~
I GeneticCancerDNAMapper: 0.324 : Realms.Realm.GetInstanceAsync ~Obtained Instance & Data~
I GeneticCancerDNAMapper: 0.324 : Xamarin.Forms.Application Content
I GeneticCancerDNAMapper: 0.349 : Xamarin.Forms.Application Content ~Creation Completed~
I GeneticCancerDNAMapper: 0.353 : Xamarin.Forms.Application.MainPage ~Displayed~
I GeneticCancerDNAMapper: 0.43 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.LoadApplication
回复:https://en.wikipedia.org/wiki/Android_One
I/GeneticCancerDNAMapper(10904): 2.453 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnCreate
I/GeneticCancerDNAMapper(10904): 2.467 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.SetTheme
I/GeneticCancerDNAMapper(10904): 2.731 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.OnCreate
I/GeneticCancerDNAMapper(10904): 3.016 : Xamarin.Forms.Forms.Init
I/GeneticCancerDNAMapper(10904): 3.166 : Realms.Realm.GetInstanceAsync ~Get Instance & Data~
I/GeneticCancerDNAMapper(10904): 3.571 : Realms.Realm.GetInstanceAsync ~Obtained Instance & Data~
I/GeneticCancerDNAMapper(10904): 3.571 : Xamarin.Forms.Application Content
I/GeneticCancerDNAMapper(10904): 3.772 : Xamarin.Forms.Application Content ~Creation Completed~
I/GeneticCancerDNAMapper(10904): 3.799 : Xamarin.Forms.Application.MainPage ~Displayed~
I/GeneticCancerDNAMapper(10904): 4.457 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.LoadApplication
答案 2 :(得分:1)
我将为此找到的所有解决方案汇总在一起,因此全部集中在一个地方。
其中一个答案链接了 this 帖子,非常有用。
除了我们还做了以下事情:
global::Xamarin.Forms.Forms.SetFlags("FastRenderers_Experimental");
MainActivity.OnCreate()
方法上添加此行global::Xamarin.Forms.Forms.Init(this, bundle);
来完成。
答案 3 :(得分:0)
我找到了解决方案。例如,我们有5个标签。并且我们有5个viewmodel或5个代码隐藏。我们定义的每个选项卡的viewmodels构造函数的启动计时器方法。并且第一个制表符构造函数在计时器启动后初始化700ms。第二个标签页在1秒后开始播放。让我们为此:
第一个选项卡主页和主视图模型是HomeViewModel。
public void HomeTimer()
{
timer.Interval = 700;
timer.Elapsed += (sender, e) => OnTimedEvent(sender, e);
timer.AutoReset = false;
timer.Enabled = true;
}
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
timer.Enabled = false;
Yap(); // yap command all the page listview and get api.
}
System.Timers.Timer timer = new System.Timers.Timer();
public HomeViewModel()
{
HomeTimer(); // hometimer starting
}
第二个选项卡是MyPage,viewmodel是MyPageViewModel,构造函数相同:
public void MyPageTimer()
{
timer.Interval = 1000; //look. home page starting 0.7 seconds after and mypage starting 1 seconds after.
timer.Elapsed += (sender, e) => OnTimedEvent(sender, e);
timer.AutoReset = false;
timer.Enabled = true;
}
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
timer.Enabled = false;
GetMypage(); // and getmypage method all the initialize the page and listview and webapi works.
}
System.Timers.Timer timer = new System.Timers.Timer();
public MyPageViewModel()
{
MyPageTimer();
}
此操作我从启动删除1秒。在执行此操作之前,我的应用程序从3.2秒开始,而现在从2.2秒开始。