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

简介: 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);
  }


相关文章
|
24天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
18 1
|
2月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
34 4
|
3月前
|
监控 Android开发 C语言
深度解读Android崩溃日志案例分析2:tombstone日志
深度解读Android崩溃日志案例分析2:tombstone日志
82 0
|
3月前
|
数据安全/隐私保护 Android开发
2023安卓逆向 -- 某合伙apk登录加密分析
2023安卓逆向 -- 某合伙apk登录加密分析
26 0
|
4月前
|
Android开发
UniApp Android 页面拖动,去掉半圆形阴影
UniApp Android 页面拖动,去掉半圆形阴影
43 0
|
2月前
|
网络协议 算法 Android开发
安卓逆向 -- 实战某峰窝APP(动态分析)
安卓逆向 -- 实战某峰窝APP(动态分析)
25 4
|
2月前
|
安全 搜索推荐 Android开发
Android 与 iOS 的比较分析
【2月更文挑战第5天】 Android 和 iOS 是目前市场上两种最流行的移动操作系统,它们都拥有自己的特点和优势。本文将会分别从操作系统设计、应用生态、安全性等方面对这两种操作系统进行比较和分析,希望能够帮助读者更好地选择适合自己的移动设备。
|
3月前
|
安全 算法 JavaScript
安卓逆向 -- 关键代码定位与分析技术
安卓逆向 -- 关键代码定位与分析技术
39 0
|
3月前
|
算法 安全 Android开发
安卓逆向 -- Frida Hook某车_sign算法分析
安卓逆向 -- Frida Hook某车_sign算法分析
76 0
|
3月前
|
安全 Android开发 数据安全/隐私保护
安卓逆向 -- SO文件逆向分析
安卓逆向 -- SO文件逆向分析
19 0