Android ViewPager Fragment使用懒加载提升性能

简介: Android ViewPager Fragment使用懒加载提升性能Fragment在如今的Android开发中越来越普遍,但是当ViewPager结合Fragment时候,由于Android ViewPager...


Android ViewPager Fragment使用懒加载提升性能

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
isVisibleToUser	boolean: 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懒加载 zhangphil@csdn");
                    }
                }
            };

            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;
        }
    }
}


相关文章
|
13天前
|
缓存 监控 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第23天】 在竞争激烈的移动市场中,一个高效的Android应用是吸引并保留用户的关键。本文将探讨如何通过一系列技术手段和最佳实践来优化Android应用的用户体验和性能表现。我们将深入分析响应式UI设计、内存管理、多线程处理以及最新的Android框架特性,揭示它们如何共同作用以减少应用延迟,提高响应速度,并最终提升整体用户满意度。
|
15天前
|
缓存 API Android开发
Android 应用优化策略:提升性能与用户体验
【4月更文挑战第21天】在移动应用开发领域,性能优化是一个持续的挑战。尤其对于Android平台,由于设备多样性和系统版本的碎片化,开发者需要采取多种策略确保应用流畅运行并给用户带来良好体验。本文将深入探讨针对Android应用的性能优化技巧,包括内存管理、UI渲染效率提升、多线程应用以及电池寿命优化等方面。这些建议旨在帮助开发者诊断和改进现有应用,或在开发新项目时提前考虑到性能因素。
|
6天前
|
缓存 监控 Android开发
提升安卓应用性能的五大关键策略
【4月更文挑战第30天】 在竞争激烈的应用市场中,卓越的性能是确保用户留存和应用成功的核心因素。本文将详细阐述五种提高安卓应用性能的有效技术策略。这些策略包括优化内存使用、减少网络请求延迟、多线程与并发处理、UI渲染优化以及电池效率改进。通过深入分析每项技术的原理及其在实际开发中的应用,旨在帮助开发者构建更快速、流畅且响应敏捷的安卓应用。
|
6天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
3天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【5月更文挑战第4天】在移动开发的世界中,性能一直是衡量应用质量的重要指标。随着Kotlin的兴起,许多Android开发者开始考虑是否应该从传统的Java迁移到Kotlin。本文通过深入分析两者在Android平台上的性能差异,帮助开发者理解Kotlin在实际项目中的表现,并提供选择编程语言时的参考依据。
17 5
|
5天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第1天】 在移动开发的世界中,性能优化始终是开发者关注的焦点。随着Kotlin的兴起,许多团队和开发者面临着一个选择:是坚持传统的Java语言,还是转向现代化、更加简洁的Kotlin?本文通过深入分析和对比Kotlin与Java在Android应用开发中的性能表现,揭示两者在编译效率、运行速度和内存消耗等方面的差异。我们将探讨如何根据项目需求和团队熟悉度,选择最适合的语言,以确保应用的高性能和流畅体验。
|
6天前
|
缓存 监控 Android开发
提升安卓应用性能的关键策略
【4月更文挑战第30天】 在竞争激烈的移动应用市场中,性能优化已成为开发流程中不容忽视的一环。尤其对于安卓平台,由于设备多样性和系统碎片化,确保应用流畅运行并减少资源消耗显得尤为关键。本文旨在探讨几个实用的策略,帮助开发者诊断常见性能瓶颈,并提供针对性的解决方案,以期达到更高效的应用性能表现。
|
6天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第30天】在Android开发领域,Kotlin作为一种现代化的编程语言,因其简洁性和功能性受到了开发者的广泛欢迎。尽管与传统的Java相比,Kotlin提供了诸多便利,但关于其性能表现的讨论始终未息。本文将深入分析Kotlin和Java在Android平台上的性能差异,通过实际测试数据揭示两种语言在编译效率、运行速度以及内存占用方面的具体表现,并探讨如何利用Kotlin的优势来提升Android应用的整体性能。
|
6天前
|
移动开发 数据库 Android开发
提升安卓应用性能的实用策略
【4月更文挑战第30天】 在竞争激烈的应用市场中,一款流畅、高效、稳定的应用是吸引和保留用户的关键。本文将针对安卓平台,深入探讨影响应用性能的各种因素,并提出一系列实用的优化策略。从内存管理到多线程处理,再到布局优化以及响应式编程模型,我们将逐一分析如何通过这些技术手段显著提升应用的性能表现。
|
6天前
|
缓存 数据处理 Android开发
提升安卓应用性能的五大技巧
【4月更文挑战第30天】 在竞争激烈的应用市场中,性能优化是提高用户体验和应用留存率的关键。本文将介绍五种实用的技术方法,帮助开发者优化他们的安卓应用性能。从减少内存占用到多线程处理,再到合理利用缓存策略,这些技巧将协助开发者构建更加流畅、响应迅速的应用程序。