Android fragment 切换加载数据卡顿问题

接着上一篇项目的进度,上一篇讲了如何利用fragment来实现下拉菜单,公用菜单,以实现切换主界面数据的功能,这时候遇到的问题是:使用了fragment的切换界面方法,但加载的数据太多,用户从一个界面切换到这个界面的时候,至少有一两秒的卡顿,这是无法忍受的,代码如下:

private void initOpenMenuItem(View popupWindow_view) {
<span style="white-space:pre">		</span>DrawableCenterTextView menu_price = (DrawableCenterTextView) popupWindow_view
<span style="white-space:pre">				</span>.findViewById(R.id.menu_price);

<span style="white-space:pre">		</span>menu_price.setOnClickListener(new OnClickListener() {
<span style="white-space:pre">			</span>FragmentTransaction transaction;

<span style="white-space:pre">			</span>@Override
<span style="white-space:pre">			</span>public void onClick(View v) {
<span style="white-space:pre">				</span>transaction = manager.beginTransaction();
<span style="white-space:pre">				</span><span style="background-color: rgb(255, 255, 0);"><span style="font-size:18px;color:#ff0000;"><strong>transaction.replace(R.id.fragment_container, priceFragment);</strong></span></span>
<span style="white-space:pre">				</span>titleView.setText(priceFragment.getFragmentTitle());
<span style="white-space:pre">				</span>transaction.commit();
<span style="white-space:pre">				</span>popupWindow.dismiss();
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>});

<span style="white-space:pre">	</span>}

上述代码在切换fragment界面的时候,根据fragment的方法api,replace是要重新生成实例的,这就势必导致数据重新加载,我们必须得采取隐藏的方式或者加一个进度条来缓解。这里我采用的是fragment提供的hide方法,来实现数据的快速显示,修改代码如下:

private void initOpenMenuItem(View popupWindow_view) {
		DrawableCenterTextView menu_price = (DrawableCenterTextView) popupWindow_view
				.findViewById(R.id.menu_price);

		menu_price.setOnClickListener(new OnClickListener() {
			FragmentTransaction transaction;

			@Override
			public void onClick(View v) {
				transaction = manager.beginTransaction();
				/*
				 * qiulinhe:2015年7月21日10:54:51
				 * 解决切换卡顿的问题
				 */
				<span style="font-size:18px;color:#333333;"><strong style="background-color: rgb(192, 192, 192);">if (!priceFragment.isAdded()) {    // 先判断是否被add过
	                transaction.hide(openPositionFragment).add(R.id.fragment_container, priceFragment).commit(); // 隐藏当前的fragment,add下一个到Activity中
	                titleView.setText(priceFragment.getFragmentTitle());
				} else {
	                transaction.hide(openPositionFragment).show(priceFragment).commit(); // 隐藏当前的fragment,显示下一个
	                titleView.setText(priceFragment.getFragmentTitle());</strong></span><span style="color:#c0c0c0;">
				}</span>

				popupWindow.dismiss();
			}
		});

	}

原理就是:

翻看了Android官方Doc,和一些组件的源代码,发现,replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。

正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。

这样就能做到多个Fragment切换不重新实例化:

由于是公司项目,不能上传整个工程文件,不过可以参考一下我的解决方式,有同样的问题的同学可以交流一下还有没有更优雅的解决办法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 06:25:15

Android fragment 切换加载数据卡顿问题的相关文章

多个fragment之间切换加载数据卡顿

Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源.有可能会导致卡顿. 就需要用到Fragment里的setUserVisibleHint这个方法里. 解决办法 package com.xgs.panku.ui; import android.app.Fragment; /** * 类描述:当切换到这个fragment的

用collection view动态加载数据卡顿的可能原因

在用collectionview动态加载数据时有个好处,就是cell得到了复用,如果整屏显示一个cell,最多只有两个cell,坏处就是需要不断的刷新cell,这时候容易卡顿. 每次滑动collectionview会调用代理方法,获取新的cell,这时你要将数据传给cell并进行显示. 现在的情况是快速滑动的时候和慢速滑动的时候不会卡顿,快速滑动的时候不会请求数据,所以卡顿原因可能是在请求数据的时候,慢速滑动的时候因为间隔时间长,数据应该都加载好了,所以卡顿原因可能是间隔过短,cell已经被创建

Android 下分批加载数据以及listView使用过程中的优化

需求:在开发过程中,listview加载的数据如果比较大,这时为了提高用户体验感,我们应该事先分批加载以及下拉刷新功能 1.首先,数据访问层需要提供分批加载功能的接口, 代码如下: package com.zaizai.safty.db.dao; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.

GridView加载大量图片卡顿问题

1  在异步加载之前的代码的和普通加载代码一样,只需要在GirdView的Adapter的public View getView(int position, View convertView, ViewGroupparent)方法使用异步加载的方式返回ImageView. 2  如果能把加载过的图片给缓存起来,而不用每次都从sd卡上读取,这样效率应该会提高不少.所以可以先建一个缓存类,MemoryCache,为了能尽可能缓存,又尽可能的不抛出OOM的异常,可以使用SoftReference<Bi

android异步任务加载数据界面实现

android 异步任务的一个后台方法本质是开启一个线程完成耗时操作,其他onPostExecute方法和onPreExecute方法运行在UI主线程用于更新UI界面.为了提高用户体验常见的异步任务加载方式现在总结如下: 1.异步加载界面效果如下: 关键代码如下所示: /** * 异步任务给列表加载数据 */ private void fillData(){ new AsyncTask<Void,Void,Void>(){ @Override protected void onPreExecu

android listView 滑动加载数据 该数据是服务端获取的

package com.sunway.works.applycash; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import com.sunway.works.R; import com.sunway.works.applycash.ApplyCashListActivity; impo

Android仿美团加载数据 小人奔跑进度动画对话框(附顺丰快递员奔跑效果)

我们都知道在Android中,常见的动画模式有两种:一种是帧动画(Frame Animation),一种是补间动画(Tween Animation).帧动画是提供了一种逐帧播放图片的动画方式,播放事先做好的图像,与gif图片原理类似,就像是在放电影一样.补间动画可以实现View组件的移动.放大.缩小以及渐变等效果. 今天我们主要来模仿一下美团中加载数据时小人奔跑动画的对话框效果,取个有趣的名字就是Running Man,奔跑吧,兄弟!话不多少,先上效果图,让各位大侠看看是不是你想要实现的效果,然

Android ListView异步加载数据

1.主Activity 1 public class MainActivity extends Activity { 2 3 private ListView listView; 4 private ArrayList<Person> persons; 5 private ListAdapter adapter; 6 private Handler handler=null; 7 //xml文件的网络地址 8 final String path="http://192.168.5.1

listview滚动到底部自动加载数据

在android中listvieww加载数据,有的是分批加载,比如每次加载20条,100条就要加载5次,如果一次性加载100条,listview加载就变的慢,如果是有图片的话,一时浪费流量,二是item中带图片会出现错位的问题,listview加载数据目前好多app做法 一:分批加载 滑动到底部自动更新 二:滑动到底部 手动的点击加载更多 三:下拉刷新+底部加载更多 今天就讲下listview滑动到底部自动更新 分析:监听listview的滑动事件,判断listview是否滑动到底部,然后去加载