您的位置:首页 > 其它

活用Activity/Fragment生命周期

2016-06-10 15:04 204 查看

做Android 的应该没有人不知道这两张图的吧:

Activity:



Fragment:



在做第一个项目的时候,我习惯性的做法是在oncreate()方法里把xml里面我要用到的所有控件find出来(不知道有么有人跟我一样干的~~):

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_take_photo);
initview();
}
private void initview() {
findViewById(R.id.takephotobutton).setOnClickListener(this);
findViewById(R.id.photoablumbutton).setOnClickListener(this);
findViewById(R.id.photoablumclip).setOnClickListener(this);
takephoto=(ImageView) findViewById(R.id.takephoto);
}


上面我通过findViewById获取到的控件只要4个,看不出来有什么问题,那如果xml里面我们接下来需要用到的控件有20个 ,30个,如果我们依然像这样来写,最后出现的结果就是我们发现,在加载这个界面的时候,感觉到明显变慢了,出现了明显的卡顿加载不流畅,查看所有方法还找不出来原因,不用怀疑,就是这里的问题啦,至于原因,有兴趣的可以看看findViewById的原理,其实从上面图可以看到 oncreate方法是activity 的入口,这个方法用于做一些初始化工作,执行onstart方法这个时候我们可以理解为activity已经显示出来,但是我们还看不见(处于后台),只有执行到onresume方法,这个时候activity才真正的显示出来,说到这里,上面出现的卡顿也就好理解了,我们在activity还没显示出来的时候就进行大量的查找操作,自然会拖慢activity显示出来的时间,从我们肉眼来看,就是加载变慢了。

解决方法就是:活用activity的生命周期,在onCreate方法里尽量少做操作,除了那些必须马上要用到的或者必须第一时间显示的,其他的一些操作,我们可以选择放到onStart() ,onResume()方法里(这个办法同样适用于fragment);

在我们通过startActivity(intent)启动另一个activityB的时候,不知道有没有盆友想过当前activityA是否是执行完了onDestroy()方法后才显示activityB 了?答案是否!

这里不再贴图了,具体过程有兴趣可以试一试,其实activityB的onResume()方法只有在activityA的onPause()方法执行完之后才会执行,在具体一点就是:只有activityA执行完了onPause()方法activityB才会显示出来。所以说如果activityA 要打开activityB ,那么最好不要在onPause()方法里做过多的耗时操作,这样也是会拖慢activity显示出来的时间,造成卡顿

当然造成应用卡顿的原因有很多,这里只是根据生命周期提出的一些方法,如果文中有什么不对的或者有盆友有更好的办法,欢迎提出来~~

最后在说点题外话,现在我们可以通过依赖注入框架(关于流行的框架,有兴趣可以看看)来替代findViewById的调用,这样可以减少代码量,so good

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: