如果一个Activity启动比较慢,需要优化,你觉得可以从哪些方面入手?

公众号:码农乐园 等级 355 0 0

打开一个app的时候速度比较慢,等一会才能看到UI,有很多种原因,下面是我根据这些个情况做出的多种优化,记录 一下。

1、采用动态布局:先是优化了布局,减少层级嵌套,使用merge优化等等。但发现加载xml布局还是慢了点,于是改为动态布局,布局的 时间减少了好几倍。

2、利用MessageQueue.IdleHandler()回调 按照activity的生命周期,onStart时可以看见页面,onResume可以获得焦点,所以就自然而然地以为在onResume时 已经布局完成,加载数据也没关系,可是我错了。因为onResume先于measure等流程,此时加载数据会导致加载布局 页面延后,给人一种打开app速度缓慢的感觉,所以如果我们想在界面绘制出来后做点什么,那么在onResume里面显 然是不合适的。(参考https://blog.csdn.net/tencent_bugly/article/details/78395717) 于是采用下面方式:


Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
// 先读本地缓存来显示数据
// 延迟拉取网络最新数据,刷新缓存和UI
return false; // false的话只执行一次,true的话会在每次消息队列为空时都回调执行。
}

}); 最新数据,刷新缓存和UI return false; // false的话只执行一次,true的话会在每次消息队列为空时都回调执行。} });

当MessageQueue消息队列里面的message为空时(大概就是onResume和measure, layout, draw都执行完以后), 才执行IdleHandler回调,此时不会阻塞主线程加载布局,又减少了大约1倍的启动时间。

3、先加载本地缓存,后从网络拉取 在app经常做的就是这种“假数据”吧,为了提高用户体验,先加载上次退出前保存的数据,再拉取新的数据覆盖。

4、从闪屏页到设置Theme背景,再到设置Window背景,直到放弃 首先,可以弄一个闪屏页,就能在打开app时很快看到UI,当然这不是我的需求。其次呢,可以通过设置Theme的背 景,很快看到UI,在activity上应用如下这种style。


<style name="XDAppTheme" parent="AppTheme">
<item name="android:windowBackground">图片</item>
<item name="android:windowIsTranslucent">false</item>
</style>

可是,这种方式有个缺点,不能动态改变图片,不符合我的需求。最后,这种设置背景的方式并不能满足我的需求,勉 强加载个背景图片充充数吧(可能减少个几毫秒时间o(╥﹏╥)o),在super.onCreate(savedInstanceState);前设置背 景:getWindow().setBackgroundDrawableResource(图片资源);

5、加载数据不要放在主线程 偶然发现,有时候加载比较慢,有时候加载比较快,为神马?于是找找找,原来某处妖孽纵横,此起彼伏,占用了我的 主线程,果断放在io线程,提升了大约300ms 如果一个Activity启动比较慢,需要优化,你觉得可以从哪些方面入手?

收藏
评论区

相关推荐

Android Activity生命周期,启动模式,启动过程详解
前言 接触过Android开发的同学都知道Activity,Activity作为Android四大组件之一,使用频率高。简单来说Activity提供了一个显示界面,让用户进行各种操作,本文主要分为以下三个部分:Activity的生命周期,启动模式,以及Activity的工作过程。文中大部分篇幅来自《Android开发艺术探索》一书,尽管想多以流程或图
Android中一个Activity关闭另一个Activity或者在一个Activity中关闭多个Activity
前言 最近项目中涉及需要在一个Activity中关闭另一个Activity或者在一个Activity中关闭多个Activity的需求,不涉及到应用的退出。自己首先想了一些方案,同时也查了一些方案,就各个方案比较下优劣。 方案一 广播的方式 这个是最容易想到的,同时也是网上提供最多的。 由于多个Activity要使用,关闭页面
Android通过URL打开Activity
关注公众号 QXF069 为每个 Activity 绑定一个 url 可以方便的让第三方 app 直接打开这些 Activity。也可以方便在 app 内部进行页面跳转,解耦。 背景 举一个常见的案例,假设我们有个产品 A,产品 A 包含 h5 网页端和客户端,当用户在手机打开我们的 h5 网页端的时候,我们会期望如果用户手机安装了我们的客户端,则直接打
重新认识Activity—Activity的生命周期
Activity的生命周期概念 当用户浏览,退出和返回应用时,Activity实例会在其生命周期中转换为不同的状态。在生命周期回调方法中,可以声明用户离开并重新进入Activity时Activity的行为方式。每个回调允许执行适合于给定状态更改的特定工作。生命周期回调的良好实现可以帮助确保您的应用程序避免: 如果用户在使用您的App时接到电话或切换
Android Fragment生命周期
Fragment 是在 Android 3.0 中引入,用于解决不同屏幕分辨率的设备上 UI 显示、交互的问题。Fragment 有自己的布局,有自己的生命周期,有自己的事件响应。 但 Fragment 又是依赖于 Activity 存在的,你可以把多个 Fragment 嵌入到一个 Activity 中或者多个 Activity 重用一个 Fragmen
Android 组件化 —— 路由设计最佳实践
引子 这篇文章会告诉你: 什么是路由,是为了解决什么问题才产生的; 业界现状是怎么样的,我们可以做什么来优化当前的问题; 路由设计思路是怎么样的,该怎么设计比较好; 如何用注解实现路由表; URL的参数如何依赖注入到Activity、Fragement;
基于Xposed自动化框架XposedAppium
基于Xposed做的一款自动化点击,滑动框架(基于安卓原生的事件分发)。可以模拟手指的一切操作,基于Xpath表达式获取View。此框架在virjar大佬的框架基础上进行的修改的,修复了部分Bug,添加常用方法等.在登入页面输入账号密码后,跳转到第二个Activity并点击对话框确定按钮。 Xposed模块:很简单,添加对应的Activity,需要实Page
创建圆角Dialog风格的Activity
一、前言:在开发中有时我们需要用到dialog,可是系统提供的dialog有时不能满足我们的要求,比如显示位置等,不够灵活,我们这时可以创建activity,使其风格和dialog一样。二、实现 1\. 1.创建样式在res/values/styles.xml中<style name"DialogActivityStyle"
如果一个Activity启动比较慢,需要优化,你觉得可以从哪些方面入手?
打开一个app的时候速度比较慢,等一会才能看到UI,有很多种原因,下面是我根据这些个情况做出的多种优化,记录 一下。1、采用动态布局:先是优化了布局,减少层级嵌套,使用merge优化等等。但发现加载xml布局还是慢了点,于是改为动态布局,布局的 时间减少了好几倍。2、利用MessageQueue.IdleHandler()回调 按照activity的生命周期
Android深入理解Context(二)Activity和Service的Context创建过程
Android框架层 Android深入理解Contextcategories: Android框架层本文首发于微信公众号「刘望舒」 前言上一篇文章我们学习了Context关联类和Application Context的创建过程,这一篇我们接着来学习Activity和Service的Context创建过程。需要注意的是,本篇的知识点会和深入理解四大组件系列的
Android深入四大组件(一)应用程序启动过程(后篇)
Android框架层 Android深入四大组件categories: Android框架层本文首发于微信公众号「刘望舒」 1.ActivityManageService到ApplicationThread的调用流程AMS的startActivity方法中return了startActivityAsUser方法:<!moreframeworks/base/s
Android深入四大组件(七)Android8.0 根Activity启动过程(后篇)
Android框架层 Android深入四大组件categories: Android框架层本文首发于微信公众号「刘望舒」 前言在几个月前我写了和这两篇文章,它们都是基于Android 7.0,当我开始阅读Android 8.0源码时发现应用程序(根Activity)启动过程照Android 7.0有了一些变化,因此又写下了本篇文章,本篇文章照此前的文章不仅
Android解析ActivityManagerService(二)ActivityTask和Activity栈管理
Android框架层 Android系统服务 ActivityManagerService Android框架层本文首发于微信公众号「刘望舒」 前言关于AMS,原计划是只写一篇文章来介绍,但是AMS功能繁多,一篇文章的篇幅远远不够。这一篇我们接着来学习与AMS相关的ActivityTask和Activity栈管理。 1.ActivityStackActivi
IntentFilter匹配规则
1、Activity启动方式我们知道,启动Activity分为两种,显式调用和隐式调用。显式调用需要明确指定被启动对象的组件信息,包括包名和类名。隐式调用不需要指定组件信息,但需要匹配目标组件的IntentFilter中所设置的过滤信息。 2、IntentFilterIntentFilter中的过滤信息包括:action、category、data。为了匹配
这是一份用心整理的Android面试总结,涨姿势!
Android Jetpack组件的作用是什么? Navigation:一个用于管理Fragment切换的工具类,可视化、可绑定控件、支持动画等是其优点。 Data Binding:不用说,都知道,加速MVVM的创建。 Lifecycle:他是我们能够处理Activity和Fragment的生命周期的重要原因,在AndroidX的Fragment和Activ