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

公众号:码农乐园 等级 825 0 0
标签: activity软件

打开一个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 Fragment生命周期
Fragment 是在 Android 3.0 中引入,用于解决不同屏幕分辨率的设备上 UI 显示、交互的问题。Fragment 有自己的布局,有自己的生命周期,有自己的事件响应。 但 Fragment 又是依赖于 Activity 存在的,你可以把多个 Fragment 嵌入到一个 Activity 中或者多个 Activity 重用一个 Fragmen
Activity启动模式
当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置。 1\. Standard模式(默认) 我们平时直接创建的Activity都是这种模式的
Activity的启动方式和flag详解
**Activity的4种状态:** **活动的**:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。 **暂停**:在很多情况下,你的Activity可视但是它没有焦
034 Android NavigationView和DrawerLayout实现抽屉式导航设计(侧边栏效果)
**1.创建带侧滑效果的activity** ![](https://oscimg.oschina.net/oscnet/333199cfe89b2025778b04b97a9ec41f2d7.png) 右击,new---->activity---->选择NavgationDrawer Activity **2.xml文件布局** (1)activi
034 Android NavigationView和DrawerLayout实现抽屉式导航设计(侧边栏效果)
**1.创建带侧滑效果的activity** ![](https://oscimg.oschina.net/oscnet/333199cfe89b2025778b04b97a9ec41f2d7.png) 右击,new---->activity---->选择NavgationDrawer Activity **2.xml文件布局** (1)activi
Activity Lifecycle
官方介绍网址:[http://developer.android.com/reference/android/app/Activity.html](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fdeveloper.android.com%2Freference%2Fandroid%2Fapp
Activity切换导致的onCreate重复执行[转]
部分网友会发现Activity在切换到后台或布局从横屏LANDSCAPE切换到PORTRAIT,会重新切换Activity会触发一次onCreate方法,我们可以在androidmanifest.xml中的activit元素加入这个属性android:configChanges="orientation|keyboardHidden" 即可,比如   **
Android Activity生命周期与启动模式
Activity的完整生命周期如下图: ![](http://static.oschina.net/uploads/img/201603/29145834_pCTs.gif) Activity的加载模式有四种: standard: 标准模式,默认的加载模式,每次通过这种模式启动目标Acitivity,都创建一个新的实例,并将该Activity添加到当前
Android 使用intent传递返回值:startActivityForResult()与onActivityResult()与setResult()参数分析,activity带参数的返回
在一个父Activity通过intent跳转至多个不同子Activity上去,当子模块的代码执行完毕后再次返回父页面,将子activity中得到的数据显示在主界面/完成的数据交给父Activity处理。这种带数据的intent跳转需要使用activity的onActivityResult()方法。 **(1)startActivityForResult([
Android 在Service中启动Activity的大坑
在Activity中其中startActivity这个大家应该是非常熟悉的;那么从service里面调用startActivity话,会怎么样呢? 会出现下面的异常: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  con
Android面试收集录18 Android Context详解
Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言,Activity本质上也是一个对象,那上面的写法有什么问题呢?估计很多人说不清道不明。Android程序不像Java程序一样,随便创建一个类,写个main(
Notification使用详解之四:由后台服务向Activity发送进度信息
上次讲到了如何在Activity中监听后台服务的进度信息,实现的方式是让Activity与后台服务绑定,通过中间对象Binder的实例操作 后台服务。从效果上来讲,这种方式是可行的,不过这种实现有个缺点,那就是Activity的任务太重了,为了监听服务的状态,我们不得不绑定服务,然后 还需不断地定时的获取最新的进度,我们为何不换一下形式呢,让Service主
TextView中使用链接打开Activity
Activity加入intent-filter支持 <activity android:name="TestActivity"> <intent-filter> <data android:host="yourhost" android:scheme="testschema" /> <