项目中引用了他人写的lazyloadfragment,博客上写的很牛逼,用起来却真的不咋地。
主要的方法:就是在oncreateView 里面调用它
private void isCanLoadData() {
if (!isInit) {
return;
}
if (getUserVisibleHint()) {
lazyLoad();
isLoad = true;
initUpdateTime();
} else {
if (isLoad) {
stopLoad();
}
}
}
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(setContentView(), container, false);
isInit = true;
/**初始化的时候去加载数据**/
mUiStatusController = UiStatusController.get();
mUiStatusController.bind(view.findViewById(getUiControllerBindView()));
isCanLoadData();
return view;
}
/**
* 视图是否已经对用户可见,系统的方法
* 只有fragment 切换的时候才会调用
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isCanLoadData();
LogUtils.i("isVisibleToUser = " + isVisibleToUser);
}
以上大概是这个fragment的全部精髓吧,但其实说是lazyLoad 就是在 oncreateView 里面加载数据,不知道大家以前是怎么写的,但是一般人都会在这里去发网络请求吧,不理解这怎么就成懒加载了?应该没有人会在fragment 初始化之前去加载数据吧。
另外一个值得吐槽的地方,感觉自己被误导了,就是这个 setUserVisibleHint,
试了一下,魅族真机测试,无论我怎么切换这个方法都没有被调用!!!查了一下,说好像只有ViewPager+Fragment 才有用,也就是说一般的activity+fragment并不适用。
我的项目里面有几个banner,需要手动暂停和开启,因为都是fragment 只要activity 执行onpause 和 onresume 所有的fragment 都会执行,那些原本在fragment 切换的时候暂停的banner 也会在onresume 开启。
解决办法
fragment 自带有一个 isVisible 方法
@Override
public void onResume() {
super.onResume();
if (mAutoScrollBanner != null && bannerPaused && isVisible()) {
mAutoScrollBanner.startAutoPlay();
bannerPaused = false;
}
}
@Override
public void onPause() {
super.onPause();
if (mAutoScrollBanner != null && isVisible()) {
mAutoScrollBanner.stopAutoPlay();
bannerPaused = true;
}
}
暂时这样改没什么问题!其他在fragment 正常切换的时候也需要stop和start,我是写在onhidden change里面的
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
Log.i(TAG, "onHiddenChanged: ");
mAutoScrollBanner.stopAutoPlay();
} else {
tryToStartBanner();
}
}
private void tryToStartBanner() {
try {
mAutoScrollBanner.resumeVideo();
mAutoScrollBanner.startAutoPlay();
} catch (Exception e) {
initDatas();
}
}
这个banner 有个坑,哎,用别人的东西到处都是坑,有时候会出现没有数据的情况,可能被回收了吧,会报数组下标越界。
看到有人自己封装一个 fragment 的可见监听,去监听onstart onresume 等等,没有深入研究,感觉只要在你觉得需要回调的地方把isvisible 回调给自定义的监听器即可,比如 onHiddenChange onstop(不可见) onresume(可见)

3万+

被折叠的 条评论
为什么被折叠?



