1.MeasureSpec的原理?
答:MeasureSpec封装了从父级传递给子级的布局需求。每个MeasureSpec代表了宽度或高度的要求。MeasureSpec实现为32位的int,由size和mode组成,高2位代表mode,低30位代表size,通过将mode和size打包成一个int值来减少对象内存分配,并提供打包和解包的方法。
MeasureSpec计算规则
2.ViewPager populate 源码时序图
首先 在ViewPager源码中可以看到 populate 是在onMeasure中被调用,在Populate函数中可以看到
① mAdapter.startUpdate(this);
ViewPager开始填充item,调用startUpdate;
②填充可用宽度的3倍或不超过屏幕外的数量
③调用了addNewItem()来添加新的item
if (curItem == null && N > 0) {
//添加新的Item
curItem = addNewItem(mCurItem, curIndex);
}
在addNewItem方法中可以看到, 适配器负责将视图添加到给定的容器中
mAdapter.instantiateItem(this, position)。
④接着在Populate函数继续往下看,会发现适配器调用了destroy
mAdapter.destroyItem(this, pos, ii.object);
销毁item。
⑤calculatePageOffsets(curItem, curIndex, oldCurInfo);
计算页面偏移量
⑥mAdapter.setPrimaryItem(this, mCurItem, curItem.object);
通知适配器当前将哪个item显示为当前页面
7️⃣ mAdapter.finishUpdate(this); 结束更新
所以ViewPager无论存在多少个item,都不会内存溢出,一直在创建和销毁。
使用ViewPager显示轮播页面,默认显示当前页面,缓存左右两个页面,如果左右都有页面,往右滑动,当前页面变为最左侧页面,进行缓存,之前最左侧页面被销毁,最右侧页面显示为当前页面;如果往左滑动,则相反之。
如图:
image.png
3.ViewPager + Fragment 缓存原理
由于ViewPager预加载缓存机制,每次缓存3个,如果之前有就不会重新创建,也不会走其生命周期。
4.懒加载
懒加载的时机:onCreateView()加载完毕,setUserVisibleHint()返回true,才可以进行加载数据。
设置两个bool 类型变量,一个isFirstVisible,一个isFragmentVisible,在onActivityCreated()和setUserVisibleHint()处理,全部为true
网友评论