眼见着安卓应用在启动广告的老路上渐行渐远,我只想劝他们一句,广告虽好,但不要贪杯哦。然而事实是,启动广告不仅让收入更多一点,也可以让启动时原本黑屏的时间有了心灵的寄托,即使一秒也是万元。其实,小编今天想说的是,放开那广告,我可以让黑屏消失,让我带你的安卓应用启动如飞。
干货驾到
飞的方法较多,我也只是列出了目前能想到的,期待观众老爷们add和append。
1.只做必要的事
听着就像句废话,但是仔细分析下自己程序的启动过程,是否有些对象初始化了但并没有在启动过程中用到,有些过程执行了但却不是启动过程中必须的。
一个好的首页启动过程是从点击桌面图标到首页数据加载并显示出来,这个过程中只做了必要之事,其他不影响这个过程的操作都可以放在首页数据加载完成后,或者退而求其次,把这些操作放在子线程中执行。
举个例子说明何为必要之事。首页是MainActivity加载Fragment1,在加载Fragment1前生成一个sharepreference对象(后面简称sp),并把设备id存到该sp中。可以看出生成的sp对象并没有在首页加载过程中用到,所以就不是必要之事,可以放到首页加载完成后再进行。
但是,如果MainActivity需要根据sp中存的变量(例如是否首次启动应用)选择加载Fragment1还是Fragment2,这里生成sp对象并获取保存的变量就成了必须之事,因为这个操作决定了首页加载的页面。
2.ViewPager+Fragment懒加载
viewpager加fragment是首页常用的形式,通常是把List<Fragment>通过构造函数传给PageAdapter,然后viewpager.setAdapter。ViewPager默认会缓存2个Fragment,这2个Fragment执行数据加载和界面绘制。而我们的首页只需要加载一个Fragment,这就需要第一个Fragment加载完成后再去加载其他Fragment,这样就加快了首页的加载显示速度。
Fragment有个生命周期方法帮我们实现了这个需求,就是setUserVisibleHint(boolean isVisibleToUser),俗称懒加载。
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
if(isVisibleToUser)
{
requestData();
}
else
{
}
}
这个方法在onCreateView之前执行,当Fragment可见时isVisibleToUser为true,这时去加载数据,不可见时为false,这时不做处理。这样那个不可见的Fragment不会执行加载数据,只会执行onCreateView中加载静态布局方法,从而减少了加载数据和刷新界面的时间,加快了首页的加载速度。
3.数据预加载
数据预加载就是要在启动时,尽量早的去加载数据。因为加载数据,尤其是加载网络数据的速度是远低于渲染界面的,所以提前加载数据,这样能更早拿到数据,从而更早完成数据到界面的绘制。例如,我们在appliction的onCreate()中就启动加载数据线程,拿到数据后通知页面刷新UI。
在实际开发中,往往会将懒加载和预加载结合使用,整体流程就是每个Fragment去实现setUserVisibleHint方法,然后在application中去加载第一个页面的数据,拿到数据后通知ui刷新。第一个页面刷新完成后再通知其他页面加载数据。这里需要注意的是在Fragmemt中要加入一个成员变量isFirstVisible,用于记录当前Fragment是否第一次显示,并在setUserVisibleHint中判断,只有不是第一次显示时才从setUserVisibleHint中加载数据。因为第一次显示时,加载的数据来源于我们通过预加载得到。
4.布局优化
布局优化是个老生常谈的问题了,因为启动时间主要来自于加载UI和加载数据,加载UI中使用LayoutInflater加载xml文件是耗时大户,所以布局优化能有效降低启动时间。常用的方法包括:使用include、merge、viewstub标签,对LayoutInflater加载的view进行复用,开启android的overDraw选项来降低xml的层级。
5.ListView的优化
这也是个老问题了,常用的方案如复用convertView、使用ViewHolder、ListView滑动时不加载图片等。在实际开发中,ListView一般会带有上下布局,而使用哪种方案去做这个需求会极大地影响ListView的加载性能,针对这个问题在另一篇文章中单独做了阐述--ScrollView嵌套ListView的前世今生,这里不再扩展。
6.数据缓存
加载数据本身就是个耗时操作,通常也是在子线程中执行。数据的来源无非本地数据和网络数据,第一次加载只能采用网络数据,优化空间有限。从第二次加载开始,先加载本地数据缓存,然后更新UI,再从网络加载数据,更新UI,并更新本地缓存。加载本地数据的速度通常快于加载网络数据,因此这也是改进启动速度的有效手段。