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

汉中建站公司永久免费域名

汉中建站公司,永久免费域名,梅州兴宁网站建设,购买网站需要注意什么冷启动相关概念 应用启动概念 冷启动#xff1a;首次打开app或者app彻底销毁后再次打开app#xff08;开关机后#xff09;#xff0c;这也是我们进行启动速度优化的主要方向。热启动#xff1a;应用运行中按home键再打开应用。温启动#xff1a;介于两者之间#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、异步加载 也可以使用异步加载布局的方式AsyncLayoutInflater 。AsyncLayoutInflater是谷歌提供的一个异步加载UI方案其可以异步加载控件并回调给UI以此减少主线程消耗。对源码和实现原理感兴趣的可以看到后面的参考文章这里简单看下使用方式 先在app的gradle下加入依赖包。 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()方法后再执行耗时操作。这个方法要比使用Handler加delay要好因为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笔记】异步加载ViewAsyncLayoutInflater原理 IdleHandler原理及使用
http://www.dnsts.com.cn/news/234940.html

相关文章:

  • 桓台网站建设开县网站制作
  • dede如何生成网站源码网站开发公司有哪些
  • 中牟县建设局网站服饰类网站开发项目
  • 网站做的不好搜索引擎案例分析结论
  • 云南工贸网站建设昆明电商网站建设
  • 上海中学门户网站上海平台网站建设报
  • 专业网站建设品牌策python基础教程pdf下载
  • 做的很好的画册网站长沙营销型网站建设
  • 网站开发面板什么软件可以做网站动图
  • 特产网站建设方案wordpress多站点分别部署
  • 网站用户体验解决方案专业公司网站 南通
  • 免费网站建设排行榜适合网络推广的项目
  • 企业网站的制作原则做网站找哪家好?聚禄鼎科技是一家给企业做网站的公司
  • 长春火车站在哪个街道补习班
  • 网站里的搜索怎么做建设展示型网站公司哪家好
  • 2017建站湖南营销型网站
  • 信息服务平台网站中铁建设集团华北分公司网站
  • 网站建设便宜不可信html5 经典网站
  • 如何建微信微商城网站手机特殊网站
  • 一级a做爰片免费网站天天看百度招聘2022年最新招聘
  • ai做的比较好的网站单一产品销售网站建设模板
  • 网站副标题怎么修改传媒公司网站模板
  • 虹口品牌网站建设标准个人简历模板免费下载
  • 上海品划做网站银川网站建设广告公司名单
  • 有没有专门做建筑造价的私单网站杭州门户网站建设公司
  • 辽宁住房建设部网站上海专业微信网站建设
  • 北京网站seo策划鞋帽网站欣赏
  • 自动优化网站软件没有了红豆网梧州论坛
  • 博物馆网站建设公司南京高端网站定制
  • 做资源网站需要什么软件seo推广有哪些方式