重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Android屏幕的刷新包含3个步骤:CPU计算屏幕数据、GPU进一步处理和缓存、最后屏幕(Display)再从缓存中把计算的屏幕数据显示出来
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的商丘网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
对于 Android 而言,第一个步骤: CPU 计算屏幕数据 指的也就是 View 树的绘制过程,也就是 Activity 对应的视图树从根布局 DecorView 开始层层遍历每个 View,分别执行测量、布局、绘制三个操作的过程。我们重点分析的也是这个步骤,关于后续的2个步骤我们可以理解为底层处理,没必要过于深入。
我们知道Android每隔16.6ms会发送一次垂直同步VSync信息量,1S也就是60帧的画面。下面这个图蓝色的是CPU计算屏幕数据时间戳,绿色的是GPU的处理,最后黄色的是屏幕。我们可以清楚的看到,每帧的画面都会提前一帧去计算以及GPU处理。
如果我们保持页面静止,那么Android还是会16.6ms发送一次垂直同步信号量,App这个时候接受不到屏幕刷新的信号。所以也就不会让 CPU 去计算下一帧画面数据,但是底层仍然会以固定的频率来切换每一帧的画面,只是它后面切换的每一帧画面都一样,所以给我们的感觉就是屏幕没刷新
我们都知道Android的刷新离不开ViewRootImpl,在上一篇文章 《Android中UI的绘制流程》 中,大致阐述了Android的UI刷新流程。这里我们进一步深入的理解源码,以及刷新UI的详细流程。首先看图:
本文 介绍两点 已是fragment的切换 一是fragment刷新
先说第一点 fragment的切换
目前fragment在开发中应用越来越广泛 当然也非常方便
而我们切换fragment 也有两中方式
第一种是replace的方法进行的 这种方式要看运用场景 用起来很方便 但是个人感觉效果并不好 因为这种方式进行切换得话 首先他会remove掉当前的fragment,然后在new 一个新的fragment进行add,也就是说当前fragment中的所有东西都是重新加载的 所以个人不建议使用这种方式进行fragment的高频率切换 这种只适合fragment切换和使用次数比较少的情况
第二种是show+hide 进行fragment切换 这种方式相比第一种可能会复杂一点 首先要建立几个fragment 开始事务 然后判断添加 举个例子
1 创建fragment……
2 添加事务 android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
–#在添加之前先进行判断隐藏#–
// 这是hide fragment 的方法
onHideFragment(ft);
3 判断添加
if (homeFragment==null){
homeFragment = new HomeFragment();
ft.add(R.id.content,homeFragment);
}else {
ft.show(homeFragment);
}
4 判断隐藏
if (homeFragment!=null){
ft.hide(homeFragment);
}
5 添加一个默认显示fragment 也就是你进入activity需要显示的那个
好 此时你就完成了使用hide + show 进行fragment切换了
现在我们说第二点 就是fragment的刷新需求
我们可能会需要fragment的刷新功能 例如说是我首页使用fragment 进行功能切换时 希望返回到之前的fragment可以刷新 或者返回到activity时 fragment也可以刷新 本人使用了 两种方法进行fragment的刷新 我想大部分应该都会使用第一种 返回activity时 fragment刷新 就是重写acvitity的onstart() 方法进行刷新fragment的数据 但是这是有弊端的 第一就是假如你使用了listview或者gridview 时会出现重复加载的情况 所以使用这种方法时 你就要进行清空数据并刷新适配器就可以避免了
第二种 就是使用hide+show时 在fragment进行切换时 刷新fragment 此时会有这样一个这样的方法 onHiddenChanged(boolean hidden);看方法名 你也可以看出来 就是在hide有变化时使用 hidden参数是boolean 当hidden为true时表示fragment在hide 此时不必更新数据 当hidden为false时 他就不隐藏了 此时更新
if (hidden){
return;
}else {
list.clear();
getSellList();
}
list是要清空的 避免重复加载
–#onHiddenChanged(boolean hidden); 这是fragment的方法哦 !!!#–
本文 到此结束 希望对各位有所帮助 有问题可以评论区提出 大家一起进步
ViewPager的数据是通过PageAdapter来装载的,刷新数据的方法有以下:
调用adapter.notifyDataSetChanged(); 刷新控件,但是要覆盖PagerAdapter的getItemPosition方法,并返回 return POSITION_NONE;
利用PagerAdapter的工作机制,就是PagerAdapter的执行顺序, PagerAdapter作为ViewPager的适配器,无论ViewPager有多少页,PagerAdapter在初始化时也只初始化开始的2个View,即调用2次instantiateItem方法。而接下来每当ViewPager滑动时,PagerAdapter都会调用destroyItem方法将距离该页2个步幅以上的那个View销毁,以此保证PagerAdapter最多只管辖3个View,且当前View是3个中的中间一个,如果当前View缺少两边的View,那么就instantiateItem,如里有超过2个步幅的就destroyItem。
每当Adapter调用instantiateItem时,运用View.setTag方法将该View标识。当需要更新这个View的数据时,通过调用ViewPager.findViewWithTag方法找到相应的View,然后更新View中的数据。
重写onStart(),在里面加上getData()即可,也就是每次进入这个页面就刷新数据
中间红色区域为RecyclerView,当编辑栏EditText占据焦点后,使用notify刷新时候,RecyclerView是不会调用OnBindViewHolder,和onCreateViewHolder方法的。可以再输入文本后使用clearFocus()清除编辑栏的焦点
我通常的做法是,自己写adapter继承于BaseAdapter,然后加一个setData的公开方法。
在activity中可以开启一个线程去取数据,取完数据调用handler对listView进行加载或刷新。
如果是加载就new MyAdapter,listView.setAdapter
如果是刷新就adapter.setData(), adapter.notifyDataSetChanged().
有不懂再问。