关于fragment+viewpager的优化
上次写了一个问答项目,用的fragment+viewpager架构,后来发现,划了几次之后,再划回来,会重新加载布局,重新获取数据,这样整个程序和卡,并且占用太多的网络资源。
当时的解决办法是,自己重写view,用最基本的Basepageradapder,算是不是很优雅的解决了问题。
当时知道是重新调用onCreateView方法原因,但是没有好的解决办法,现在知道了,这里记载一下。
我实验了viewpager加载四个fragment:
第一次进入的时候:
|
1
2
3
4
5
6
|
<span style="font-size:18px;">03-01 13:50:16.151 22667-22667/com.graypn.modelproject I/onCreate1﹕ onCreate03-01 13:50:16.151 22667-22667/com.graypn.modelproject I/onCreateView1﹕ onCreateView03-01 13:50:16.161 22667-22667/com.graypn.modelproject I/onActivityCreated1﹕ onActivityCreated03-01 13:50:16.161 22667-22667/com.graypn.modelproject I/onCreate2﹕ onCreate03-01 13:50:16.161 22667-22667/com.graypn.modelproject I/onCreateView2﹕ onCreateView03-01 13:50:16.161 22667-22667/com.graypn.modelproject I/onActivityCreated2﹕ onActivityCreated</span> |
往右滑动到第二个界面:
|
1
2
3
|
<span style="font-size:18px;">03-01 13:51:22.391 22667-22667/com.graypn.modelproject I/onCreate3﹕ onCreate03-01 13:51:22.391 22667-22667/com.graypn.modelproject I/onCreateView3﹕ onCreateView03-01 13:51:22.401 22667-22667/com.graypn.modelproject I/onActivityCreated3﹕ onActivityCreated</span> |
往右滑动到第三个界面:
|
1
2
3
4
|
03-01 13:55:24.351 24165-24165/com.graypn.modelproject I/onDestroyView1﹕ onDestroyView03-01 13:55:24.351 24165-24165/com.graypn.modelproject I/onCreate4﹕ onCreate03-01 13:55:24.351 24165-24165/com.graypn.modelproject I/onCreateView4﹕ onCreateView03-01 13:55:24.361 24165-24165/com.graypn.modelproject I/onActivityCreated4﹕ onActivityCreated |
往右滑动到第四个界面:
|
1
|
03-01 13:56:22.021 24165-24165/com.graypn.modelproject I/onDestroyView2﹕ onDestroyView |
往左划到第三个界面:
|
1
2
|
03-01 13:58:09.541 24165-24165/com.graypn.modelproject I/onCreateView2﹕ onCreateView03-01 13:58:09.541 24165-24165/com.graypn.modelproject I/onActivityCreated2﹕ onActivityCreated |
结论:viewpager会加载和当前页面相连的两个fragment,会销毁相邻第三个页面的view,再次调用是会重新oncreateview和onactivityreate。
我们需要优化自己的fragment,如下时我优化后的类:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
<span style="font-size:18px;">/** * 提供了fragment的封装后基类,提供context给子类使用 * * @author Graypn */public abstract class BaseFragment extends Fragment { //根部view private View rootView; protected Context context; private Boolean hasInitData = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = getActivity(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (rootView == null) { rootView = initView(inflater); } return rootView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (!hasInitData) { initData(); hasInitData = true; } } @Override public void onDestroyView() { super.onDestroyView(); ((ViewGroup) rootView.getParent()).removeView(rootView); } /** * 子类实现初始化View操作 */ protected abstract View initView(LayoutInflater inflater); /** * 子类实现初始化数据操作(子类自己调用) */ public abstract void initData(); /** * 封装从网络下载数据 */ protected void loadData(HttpRequest.HttpMethod method, String url, RequestParams params, RequestCallBack<string> callback) { if (0 == NetUtils.isNetworkAvailable(getActivity())) { new CustomToast(getActivity(), 无网络,请检查网络连接!, 0).show(); } else { NetUtils.loadData(method, url, params, callback); } }}</string></span> |
加入rootView,缓存加载后的view,如果有就不重新加载数据。
加入判断是否已经加载数据完成的标志变量,如果已经加载了数据,就不重新加载数据。
算是优雅的解决了优化的问题,希望能帮到有同样问题的同学。
关于fragment+viewpager的优化的更多相关文章
- 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航
Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actio ...
- TabActivity 、fragemnt+fragment 和 Fragment+Viewpager 优缺点
1 TabActivity : 1 过时了 . 2 activity . 是作为android的四大组件... 重量级的家伙 ViewGroup : 特别麻 ...
- Android主页导航:fragment+viewpager
简单实现Fragment+ViewPager实现主页导航控制,效果如下: 一.activity_main.xml布局文件: <?xml version="1.0" encod ...
- 巧力避免ViewPager的预加载数据,Tablayout+Fragment+viewPager
问题描述 最近在进行一个项目的开发,其中使用到了Tablayout+Fragment+viewPager来搭建一个基本的框架,从而出现了设置数据适配器的时候,item的位置错乱问题.我打印log日志的 ...
- Android中Fragment+ViewPager的配合使用
官方推荐 ViewPager与Fragment一起使用,可以更加方便的管理每个Page的生命周期,这里有标准的适配器实现用于ViewPager和Fragment,涵盖最常见的用例.FragmentPa ...
- Fragment +ViewPager
public class MainActivity extends FragmentActivity { private ViewPager vp; @Override protected vo ...
- 安卓开发笔记——Fragment+ViewPager组件(高仿微信界面)
什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再 ...
- Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager
action来实现tab标签 并跟fragment结合 因为要写新闻客户端这个tab导航是必须的 这里我写几个小练习,希望大家融会贯通. 1actionbar设置tab +fragment 布局是个l ...
- Viewpager模仿微信主布局的三种方式 ViewPager,Fragment,ViewPager+FragmentPagerAdapter
效果大概就是这样 很简单 : 1 创建 top 和bottom 2主界面布局 添加top 和bottom 中间添加一个ViewPage 3 给ViewPager 和 底部View设置点击事件 源码下载 ...
随机推荐
- JavaScript全局属性/函数
JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示某个值是不是数字值. und ...
- HTTP要点概述:五,HTTP的无状态性,持久连接,Cookie
一,HTTP的无状态性: HTTP 是一种不保存状态,无状态(stateless)协议.HTTP 协议自身不对请求和响应之间的通信状态进行保存.也就是说在 HTTP 这个级别,协议对于发送过的请求或响 ...
- (转)web会话管理方式
阅读目录 1. 基于server端session的管理 2. cookie-based的管理方式 3. token-based的管理方式 4. 安全问题 5. 总结 http是无状态的,一次请求结束, ...
- SuperSocket中的Server是如何初Initialize的
第一个函数 d:\sourcecode\github\supersocket\quickstart\basic\telnetserver_startbyconfig\program.cs static ...
- JavaScript代码优化新工具UglifyJS
jQuery 1.5 发布的时候 john resig 大神说所用的代码优化程序从Google Closure切换到UglifyJS,新工具的压缩效果非常令人满意. UglifyJS 是一个服务端no ...
- VS2015 framework4.5代码提示英文切换为中文
输入下面的地址,复制里面所有的文件 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0 ...
- sublime text2 配置php本地环境时遇到的错误。
首先,将PHP加到电脑的环境变量中如图(D:\PHPEnv\PHP5是我PHP的安装目录): 第二步:添加编译系统配置 第三步:配置详情: { "cmd": ["php. ...
- 对mysql修改库里面所有的引擎mysaim 为 innodb
1.查看当前数据引擎的命令: show engines; 2. USE `[DBNAME]`; SELECT GROUP_CONCAT(CONCAT( 'ALTER TABLE ' ,TABLE_NA ...
- 洛谷 P2142 高精度减法(模板)
题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 2 1 输出样例#1: 1 说明 20%数据 ...
- NET 编程题
1.C#编写创建一个线程的代码 using System; using System.IO; using System.Threading ; class MyThread{ public int c ...