当前位置: 首页 > news >正文

用html做网站顺序卡纸做荷花网站

用html做网站顺序,卡纸做荷花网站,海外贸易在什么网站做,自己买空间做网站冷启动相关概念 应用启动概念 冷启动:首次打开app或者app彻底销毁后再次打开app(开关机后),这也是我们进行启动速度优化的主要方向。热启动:应用运行中按home键再打开应用。温启动:介于两者之间&#xff…

冷启动相关概念

应用启动概念

  • 冷启动:首次打开app或者app彻底销毁后再次打开app(开关机后),这也是我们进行启动速度优化的主要方向。
  • 热启动:应用运行中按home键再打开应用。
  • 温启动:介于两者之间,比如:说用户关闭应用又重新启动应用,这是应用进程还没被销毁。或者系统主动释放掉后台应用,然后用户就将它启动,这时虽然要再重新执行onCreate,但是saveInstanceState实例已经保存,可以提高启动速度。

谷歌官方应用启动时间说明

冷启动时间

冷启动优化就是要缩短冷启动的时间,冷启动时间获取方法,先kill掉进程,或者重新安装一个应用,串口输入下面的命令:

am start -W com.jane.demo/.MainActivity

发送命令后有下面的数据,TotalTime是冷启动的时间。

Status: ok
LaunchState: COLD
Activity: com.jane.demo/.MainActivity
TotalTime: 788
WaitTime: 792

冷启动优化方法

优化前注意应用版本(debug还是release),之前新建一个空项目(只显示一个hello world),想测试想一个空项目启动大概需要多长时间。结果用了接近800ms,震惊不已,后面发现是debug版本的原因,改为release后400ms,降低了一半。

布局加载优化

1、减少布局复杂度

可以使用merge等减少界面层级,这个是比较常用的方法。

2、异步加载

也可以使用异步加载布局的方式AsyncLayoutInflaterAsyncLayoutInflater是谷歌提供的一个异步加载UI方案,其可以异步加载控件并回调给UI,以此减少主线程消耗。对源码和实现原理感兴趣的可以看到后面的参考文章,这里简单看下使用方式:

先在appgradle下加入依赖包。

 implementation 'androidx.asynclayoutinflater:asynclayoutinflater:1.0.0'

如下为测试代码:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {//测试1:使用原始方式加载//setContentView(R.layout.activity_main);//测试2:使用AsyncLayoutInflater异步加载new AsyncLayoutInflater(this).inflate(R.layout.activity_main,null, new AsyncLayoutInflater.OnInflateFinishedListener(){@Overridepublic void onInflateFinished(View view, int resId, ViewGroup parent) {setContentView(view);         }}); }
}
  • 第一次测试,onCreate中直接调用setContentView(),然后看冷启动时间:TotalTime: 829
  • 第二次测试,使用AsyncLayoutInflater异步加载,冷启动时间:TotalTime: 712

启动耗时操作后移

Android 12 SplashScreen API快速入门在郭神的这个文章中,通过验证得出结论:onCreate()onResume()等生命周期方法都是在App开始绘制第一帧之前执行的,因此在这些生命周期函数中,耗时的操作应该后移或者放到子线程处理。

1、使用View.post()方法后移耗时操作

郭神的文章有分析,post()回调则是在App绘制第一帧之后执行的。因此可以在View.post()方法后,再执行耗时操作。这个方法要比使用Handlerdelay要好,因为delay的时间是不确定的。

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());View rootView = mActivityMainBinding.getRoot();setContentView(rootView);//测试1:耗时300ms操作/* try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}*/       rootView.post(new Runnable() {@Overridepublic void run() {//测试2:耗时300ms操作try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}}});            }
}
  • 第一次测试,把300ms耗时操作直接放在onCreate中,然后看冷启动时间:TotalTime: 1124
  • 第二次测试,把300ms耗时操作放在IdleHandler的回调中,冷启动时间:TotalTime: 853

2、使用IdleHandler,后移耗时操作

IdleHandler会在MessageQueue中没有Message要处理或者要处理的Message都是延时任务的时候得到执行,说明此时线程是空闲状态。如果是在主线程,则表明当前UI没有绘制动作,所以可以根据监听IdleHandler是否执行来判断UI是否绘制完成,从而避免在UI绘制的时候进行耗时操作,影响UI绘制效率。

queueIdle()方法回调,说明UI第一帧绘制完成,可以理解为UI首次可见,这个比onResume精确的多,因为onResume回调的时候界面还没有开始绘制,此时界面是不可见的,测试代码如下;

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());View rootView = mActivityMainBinding.getRoot();setContentView(rootView);//测试1:耗时300ms操作/* try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}*/Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {@Overridepublic boolean queueIdle() {//此处添加处理任务//测试2:耗时300ms操作try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}// 返回false表示MessageQueue在执行完这段代码后将该IdleHandler删除,反之不删除,下一次继续执行return false;}});}
}
  • 第一次测试,把300ms耗时操作直接放在onCreate中,然后看冷启动时间:TotalTime: 1124
  • 第二次测试,把300ms耗时操作放在IdleHandler的回调中,冷启动时间:TotalTime: 878

3、使用子线程处理耗时操作

在测试用,将模拟的耗时操作放到了子线程中执行,后面又给子线程加上了一个最低的优先级。

在Android中,线程优先级范围从1到10,其中1是最低优先级,10是最高优先级。默认情况下,所有线程都具有相同的优先级5,也就是new一个线程出来优先级就是5。

通过设置线程的优先级,我们可以改变线程在调度器中的竞争情况,从而影响其执行顺序。推荐在Application的某些初始化方法使用子线程加载。

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());View rootView = mActivityMainBinding.getRoot();setContentView(rootView);//测试1:耗时300ms操作/* try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}*///测试2:开一个子线程操作Thread thread = new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}}}//测试3:给子线程加一个低的优先级thread.setPriority(Thread.MIN_PRIORITY);thread.start();}
}
  • 第一次测试,把300ms耗时操作直接放在onCreate()中,然后看冷启动时间:TotalTime: 1124
  • 第二次测试,把300ms耗时操作放在子线程中,冷启动时间:TotalTime: 776
  • 第三次测试,给子线程加一个低的优先级,冷启动时间:TotalTime: 730

实际测试中,第二次和第三次时间其实是差不多的,都有大一点有小一点的,这个在我的测试代码中优化不明显。但是还是建议加上,不然也会争抢主线程资源,影响优化启动时间。

码字不易有帮助到大家请点赞、收藏,谢谢。

参考文章:

【Android笔记】异步加载View,AsyncLayoutInflater原理
IdleHandler原理及使用

http://www.yayakq.cn/news/527636/

相关文章:

  • 专业做网站的团队wordpress图片灯箱效果修改
  • 网站做移动适配苏州网站建设及推广
  • 禁止网站采集网站建设方案书 本案
  • 微商网站网站开发聊天室
  • 计算机网站开发的目的东莞seo优化方案
  • 深圳网站建设知名公司wordpress加入购物
  • 使用免费建站郑州做网站推广的公司哪家好
  • 成都地区网站建设福建省网站备案用户注销
  • 福州网站建设哪家专业微营销工具
  • 网站开发的基本功能网站收录一键提交
  • 宿迁市建设局网站青岛的互联网公司
  • 网站cms系统俄语网站建站
  • 网络网站是多少钱一年沈阳便宜做网站的
  • 自已建外贸网站廊坊网站建设方案策划
  • 长沙网站制东莞松山湖风景区
  • 网站备案 座机号码安徽省建设工程网上服务平台
  • 怎么免费制作一个企业网站在线手机网页制作
  • 房地产营销门户网站建设wordpress仿内涵段子
  • 企业建设网站需要服务器吗安平做网站的公司
  • 网站如何添加认证联盟要实现对网站中的所有内容进行搜索代码应该怎么写
  • 怎么自己建网站赚钱注册完域名之后怎么找到网站
  • 贵阳网站建设制作方法滁州网络推广公司
  • 中山市住房建设局网站国内有名的网站设计公司
  • 网站建设与运营公司主营业务收入与成本运城网站建设价格
  • app小程序网站开发公司网站用个人备案 2018
  • 新兴建设网站我想看女生尿频怎么办
  • 做图有什么网站html5网站开发公司
  • 景点介绍网站模板福州嵌入式培训
  • apache 配置网站网站seo怎么做的
  • 简述电子政务系统网站建设的基本过程广州网页设计师