android Fragment单页面加载,避免重复加载(懒加载)分析

上面两个页面都是 ViewPager + Fragment实现,Viewpager + Fragment情况下,fragment的生命周期因Viewpager的缓存机制而失去了具体意义

目前问题:每次进入4个Fragment的生命周期都会走一遍,数据同时请求,这就会造成UI初始化较慢

需求:每次进入只加载当前看到界面数据、切换时请求当前选项卡数据、重复切换只加载一次

具体实现原理:

使用Fragment类自带方法setUserVisibleHint()判断当前fragment是否对用户可见,根据回调的isVisibleToUser参数来进行相关的逻辑判断。重写该方法,创建变量isVisible拿到是否可见标志。

但是直接根据isVisible判断就加载数据,可能onCreateView()方法并未执行完毕,此时就会出现NullPointerException空指针异常。所以就需要满足控件初始化完成,用户可见,才能加载数据。

为了方便继承调用,将实现封装到了BaseFragment中

package com.jky.mobilebzt.fragment;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.widget.Toast;


public  class BaseNewFragment extends Fragment {

	private static final String TAG = BaseFragment.class.getSimpleName();

	private boolean isFragmentVisible;
	private boolean isReuseView;
	private boolean isFirstVisible;
	private View rootView;
	public Context context;

	@Override
	public void setUserVisibleHint(boolean isVisibleToUser) {
		super.setUserVisibleHint(isVisibleToUser);
		//setUserVisibleHint()有可能在fragment的生命周期外被调用
		if (rootView == null) {
			return;
		}
		if (isFirstVisible && isVisibleToUser) {
			onFragmentFirstVisible();
			isFirstVisible = false;
		}
		if (isVisibleToUser) {
			onFragmentVisibleChange(true);
			isFragmentVisible = true;
			return;
		}
		if (isFragmentVisible) {
			isFragmentVisible = false;
			onFragmentVisibleChange(false);
		}
	}

	@Override
	public void onCreate(@Nullable Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		context = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light);
		initVariable();
	}

	@Override
	public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
		if (rootView == null) {
			rootView = view;
			if (getUserVisibleHint()) {
				if (isFirstVisible) {
					onFragmentFirstVisible();
					isFirstVisible = false;
				}
				onFragmentVisibleChange(true);
				isFragmentVisible = true;
			}
		}
		super.onViewCreated(isReuseView ? rootView : view, savedInstanceState);
	}

	@Override
	public void onDestroyView() {
		super.onDestroyView();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		initVariable();
	}

	private void initVariable() {
		isFirstVisible = true;
		isFragmentVisible = false;
		rootView = null;
		isReuseView = true;
	}


	private Toast toast;

	public void showShortToast(String text) {
		if (!TextUtils.isEmpty(text)) {
			if (toast != null) {
				toast.cancel();
				toast = null;
			}
			if(getActivity()!=null){
				toast = Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT);
				toast.show();
			}
		}
	}

	protected void reuseView(boolean isReuse) {
		isReuseView = isReuse;
	}

	protected void onFragmentVisibleChange(boolean isVisible) {

	}

	protected void onFragmentFirstVisible() {

	}

	protected boolean isFragmentVisible() {
		return isFragmentVisible;
	}
}

 在fragment中继承BaseFragment并实现两个方法 onFragmentVisibleChange 和onFragmentFirstVisible

	@Override
	protected void onFragmentVisibleChange(boolean isVisible) {
	}

	@Override
	protected void onFragmentFirstVisible() {
    //这里面写请求数据的方法
		PAGE_INDEX = 1;
		getData(0);
	}
希望对大家有所帮助。欢迎各位小伙伴加入我的qq群:开发一群:454430053 (付费)开发二群:537532956 (付费)开发三群:812695329(免费)这里已经有很多小伙伴在等你了,快来加入我们吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再见孙悟空_

你的鼓励将是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值