Fragment在如今的Android开发中越来越普遍,但是当ViewPager结合Fragment时候,由于Android ViewPager内在的加载机制,导致一个比较严重的加载性能问题,具体来说,假设一个ViewPager中有n多个Fragment,那么ViewPager在初始化阶段将一次性的初始化FragmentPagerAdapter中的至少3个Fragment(如果Fragment多于3),创建和加载FragmentPagerAdapter

中Fragment中的View和数据。这个问题在以前轻量级app中不常见,而如今的APP,数据量越来越大,view越来越酷炫,这也意味着如果一次性全部创建全部这些Fragment,将导致比较严重的性能开销,处理不善将导致内存堆栈溢出而致使APP崩溃。

解决该问题的一个方案就是利用Fragment的setUserVisibleHint。

setUserVisibleHint的Android官方文档:setUserVisibleHint

void setUserVisibleHint (boolean isVisibleToUser)

Set a hint to the system about whether this fragment's UI is currently visible to the user. This hint defaults to true and is persistent across fragment instance state save and restore.

An app may set this to false to indicate that the fragment's UI is scrolled out of visibility or is otherwise not directly visible to the user. This may be used by the system to prioritize operations such as fragment lifecycle updates or loader ordering behavior.

Note: This method may be called outside of the fragment lifecycle. and thus has no ordering guarantees with regard to fragment lifecycle method calls.

Parameters

isVisibleToUserboolean: true if this fragment's UI is currently visible to the user (default), false if it is not.

我写的一个例子,说明Android中使用ViewPager加载Fragment使用懒加载的实例代码:package zhangphil.app;

import android.os.Handler;

import android.os.Message;

import android.os.SystemClock;

import android.support.annotation.Nullable;

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentPagerAdapter;

import android.support.v4.view.ViewPager;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ViewPager pager = (ViewPager) findViewById(R.id.viewpager);

ItemFragmentPagerAdapter adapter = new ItemFragmentPagerAdapter(this.getSupportFragmentManager());

pager.setAdapter(adapter);

}

public static class ItemFragment extends Fragment {

private TextView text;

@Override

public void setUserVisibleHint(boolean isVisibleToUser) {

Log.d("当前Fragment是否可见?", String.valueOf(isVisibleToUser));

if (isVisibleToUser) {

//加载

loadData();

} else {

}

}

//在这里假设一个Fragment需要加载很多数据很复杂很耗时的时间后才能获得足够数据渲染View

private void loadData() {

final Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

if (msg.what == 0xa1) {

//加载完毕,赋值

text.setText("Fragment懒加载 [email protected]");

}

}

};

new Thread(new Runnable() {

@Override

public void run() {

//假设此处是耗时操作

SystemClock.sleep(10000);

handler.sendEmptyMessage(0xa1);

}

}).start();

}

@Override

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

text = (TextView) view.findViewById(android.R.id.text1);

text.setText("加载中...");

}

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

return inflater.inflate(android.R.layout.simple_list_item_1, null);

}

}

private class ItemFragmentPagerAdapter extends FragmentPagerAdapter {

public ItemFragmentPagerAdapter(FragmentManager fm) {

super(fm);

}

@Override

public Fragment getItem(int position) {

return new ItemFragment();

}

@Override

public int getCount() {

return 999;

}

}

}

android 懒加载用法,Android ViewPager Fragment使用懒加载提升性能详解相关推荐

  1. Android Material Design 系列之 BottomNavigationView + ViewPager + Fragment + BadgeView 开发详解

    前言 BottomNavigationView 是 Material Design 提供的一个标准底部导航栏的实现,可以轻松的实现导航栏菜单之间的切换与浏览.底部导航使用户更方便的查看和切换最高层级的 ...

  2. Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解

    Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 目录 Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 一.OpenGL ES渲染管线 1.基本处 ...

  3. Android自动化测试环境部署及adb sdkmanager avdmanager Monitor DDMS工具使用及命令详解

    环境部署及工具使用 系列文章 前言 环境部署 硬件环境 软件环境 ADB工具 adb组成 adb命令 android命令 sdkmanager 命令 avdmanager命令 管理模拟器 monito ...

  4. android-短信验证功能,Android实现获取短信验证码的功能以及自定义GUI短信验证详解...

    <Android实现获取短信验证码的功能以及自定义GUI短信验证详解>由会员分享,可在线阅读,更多相关<Android实现获取短信验证码的功能以及自定义GUI短信验证详解(8页珍藏版 ...

  5. android 移除fragment,Android Viewpager+Fragment取消预加载及Fragment方法的学习

    1.在使用ViewPager嵌套Fragment的时候,由于VIewPager的几个Adapter的设置来说,都会有一定的预加载.通过设置setOffscreenPageLimit(int numbe ...

  6. android工具am的用法,Android am/pm命令用法

    am命令的参数介绍: usage: am [subcommand] [options] start an Activity: am start [-D] -D: enable debugging se ...

  7. Android携程高级用法,Android真正仿携程首页view实现

    一 需求:实现view的点击缩放效果,类似于携程首页. 二 需求分析:对于单纯的view的缩放还是比较简单的,我们使用单纯的android缩放动画就可以实现.但是按照携程首页的view来做的话,里面是 ...

  8. 【Android UI设计与开发】8.顶部标题栏(一)ActionBar 奥义·详解

    一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和men ...

  9. 疯狂Android讲义(二)——第一部分:界面编程与视图 (View) 组件详解

    这里主要针对一些控件和布局的使用,篇幅会有点长.而且,不会像第一章一样全部详细列出.本章主要会用知识点的方式展示内容. ① Android应用开发的-项内容就是用户界面的开发.不管应用实际包含的逻辑多 ...

  10. Android补间动画之ScaleAnimation、AlphaAnimation、RotateAnimation、TranslateAnimation、AnimationSet详解

    首发:http://blog.csdn.net/harvic880925/article/details/40117115 一.概述 前两篇,我为大家讲述了利用XML来定义动画及插值器,但在代码中,我 ...

最新文章

  1. 进入临界有什么用?STM32单片机怎么实现?
  2. 我说分布式事务之消息最终一致性事务(一):原理及实现
  3. python规范化字符串_python中正确的字符串编码规范
  4. C++中使用new和delete运算符实现二维数组的操作
  5. jquery input事件
  6. 最小硬盘实现单原子信息存储 超现有硬盘500倍
  7. python面向对象(part2)--封装
  8. php替换不区分大小写_PHP大小写问题:函数名和类名不区分,变量名区分
  9. php同步邮件,php – 使用同步驱动程序在Laravel 4中排队电子邮件
  10. 排序专题之C++中的sort函数调用
  11. vagrant启动报错The following SSH command responded with a no
  12. 方法、hadoop源码之JobQueueTaskScheduler-by小雨
  13. 2 java内存模型是什么_java中内存模型是什么?有什么用?
  14. matlab 偏最小二乘 光谱,【GreenSim原创】偏最小二乘法的Matlab源码
  15. 有关java的几个日期类的转换
  16. 苹果自带的清理软件_苹果电脑清理软件哪个好?对比CleanMyMac和腾讯柠檬清理软件...
  17. 假设一张纸的厚度是1mm,那么这张纸折叠多少次可以到达珠穆朗玛峰的高度(8848m)?
  18. Pinia——Actions
  19. bootstrap4 利用m- p-调整元素之间距离
  20. linux rhel unix centos FreeBSD 查看CPU核数使用率 系统 位 内存大小 硬盘 HBA光纤卡号 常用命令

热门文章

  1. Linux 内核C -- 第02课:驱动中的指定初始化
  2. Linux signal 那些事儿 (3)
  3. 非常可乐(广度搜索)
  4. kvm安装android虚拟机,qemu-kvm安装虚拟机
  5. pandas cut qcut 分箱算法详解
  6. 计算机体系结构----指令流水线吞吐率、效率计算
  7. 使用pyinstaller讲python文件打包成exe文件运行时,弹出命令行界面
  8. Linux问题---------E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
  9. 使用原生javaScript创建ul和li对象以及操作
  10. Lucas(卢卡斯)定理---组合数取模问题