Android Loader使用时,屏幕解锁后,重复加载

在使用AsyncTaskLoader时,当手机解锁后,会重复加载数据,代码如下:

	static class CouponShopQueryLoader extends
			AsyncTaskLoader<List<CouponStore>> {

		private int couponId;

		public CouponShopQueryLoader(Context context, int couponId) {
			super(context);
			this.couponId = couponId;

		}

		@Override
		protected void onStartLoading() {

			forceLoad();
		}

		@Override
		public List<CouponStore> loadInBackground() {
			//查询数据加载
		}
	}

这时候,很奇怪的现象就出来了,每次手机解锁后,数据都会重复了,重复加载。经查阅CursorLoader源码后发现,原来还是自己太嫩了,loader使用时,没有严格遵守android官方帮助文档demo的使用方式。经修改后:

	static class CouponShopQueryLoader2 extends
			AsyncTaskLoader<List<CouponStore>> {

		private List<CouponStore> mData;
		private int couponId;

		public CouponShopQueryLoader2(Context context, int couponId) {
			super(context);
			this.couponId = couponId;

		}

		// final ForceLoadContentObserver mObserver;

		/* Runs on a worker thread */
		@Override
		public List<CouponStore> loadInBackground() {
			mData = ds.queryShopByCoupon(couponId, pageNo, PAGE_SIZE);
			return mData;
		}

		/* Runs on the UI thread */
		@Override
		public void deliverResult(List<CouponStore> data) {
			if (isReset()) {
				return;
			}

			if (isStarted()) {
				super.deliverResult(data);
			}
		}

		/**
		 * Starts an asynchronous load of the contacts list data. When the
		 * result is ready the callbacks will be called on the UI thread. If a
		 * previous load has been completed and is still valid the result may be
		 * passed to the callbacks immediately.
		 *
		 * Must be called from the UI thread
		 */
		@Override
		protected void onStartLoading() {
			if (mData != null) {
				deliverResult(mData);
			}
			if (takeContentChanged() || mData == null) {
				forceLoad();
			}
		}

		/**
		 * Must be called from the UI thread
		 */
		@Override
		protected void onStopLoading() {
			Log.d("sss", "onStopLoading");
			// Attempt to cancel the current load task if possible.
			cancelLoad();
		}

		@Override
		public void onCanceled(List<CouponStore> cursor) {
			Log.d("sss", "onCanceled");
		}

		@Override
		protected void onReset() {
			super.onReset();
			Log.d("sss", "onReset");
			// Ensure the loader is stopped
			onStopLoading();
			mData = null;
		}

	}

修改后,重复加载的现象解决了,究其原因是没有重写

	/**
		 * Must be called from the UI thread
		 */
		@Override
		protected void onStopLoading() {
			Log.d("sss", "onStopLoading");
			// Attempt to cancel the current load task if possible.
			cancelLoad();
		}

当手机屏幕关闭时,会调用onStopLoading()方法,此时应该将loader取消掉,当屏幕解锁时,会去执行onStartLoading()方法,在onStartLoading方法中根据数据是否需要重新加载进行判断。而如果不在onStartLoading进行loader状态判断的话,就导致了数据重复加载的问题! ok---解决了!

提示:在学习android开发中,官方文档其实是很好的,遵守他们的编写规范,可以使自己少走好多弯路。

时间: 2024-11-02 14:20:35

Android Loader使用时,屏幕解锁后,重复加载的相关文章

Android Loader使用,屏幕解锁,重复荷载

正在使用AsyncTaskLoader时间.当手机被解锁,重复加载数据,码,如以下: static class CouponShopQueryLoader extends AsyncTaskLoader<List<CouponStore>> { private int couponId; public CouponShopQueryLoader(Context context, int couponId) { super(context); this.couponId = coup

android Fragment 使用时的技巧

android 从3.0开始引入了Fragment逐渐的取代了tabhost与GroupActivity,但是在使用中发现有些细节上的处理:通过Activity管理Fragment,我们需要关心以下的几个 问题: 1:防止Fragment的重复创建 2:怎么使用add还是使用replace来添加 以上的两个问题其实有好的方式来替代,那就是使用FragmentPagerAdapter来管理控制: demo代码不多,会全部的贴出来如下:重点部分通过颜色的标识进行的区分 activity_main.x

Android Studio使用时源码到处报红色警告,运行时又没错

转载地址:http://www.07net01.com/program/2016/04/1452749.html [摘要:正在AS上开辟时,碰到那个题目,翻开全部的Java源文件,右边一起标赤色,找没有到类,到没有到方式,由于不克不及面击跳转,开辟时纠结了很久,试了clean.rebuild等种种方式皆没有起感化,又] 在AS上开发时,遇到这个问题,打开所有的java源文件,右侧一路标红色,找不到类,到不到方法,因为不能点击跳转,开发时纠结了好久,试了clean.rebuild等各种方法都不起作

ym——Android怎样支持多种屏幕

转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 原文链接:http://developer.android.com/guide/practices/screens_support.html 支持多屏 Android涉及各种各样的支持不同屏幕尺寸和密度的设备.对于应用程序,Android系统通过设备和句柄提供了统一的开发环境.大部分工作是校正每个应用程序的用户界面到它显示的屏上.与此同一时候,系统提供APIs同意你控制应用界面为特定

ym——Android如何支持多种屏幕

原文链接:http://developer.android.com/guide/practices/screens_support.html 支持多屏 Android涉及各种各样的支持不同屏幕尺寸和密度的设备.对于应用程序,Android系统通过设备和句柄提供了统一的开发环境,大部分工作是校正每一个应用程序的用户界面到它显示的屏上.与此同时,系统提供APIs允许你控制应用界面为特定的屏幕尺寸和密度,为不同屏幕的配置提供最优化的用户界面设计.例如,你可能会要一个平板电脑的用户界面,这不同于手机的用

Android Loader详解(官方文档翻译)

装载器从android3.0开始引进.它使得在activity或fragment中异步加载数据变得简单.装载器具有如下特性: 它们对每个Activity和Fragment都有效. 他们提供了异步加载数据的能力. 它们监视数据源的一将一动并在内容改变时传送新的结果. 当由于配置改变而被重新创建后,它们自动重连到上一个加载器的游标,所以不必重新查询数据. 装载器API概述 在使用装载器时,会涉及很多类和接口们,我们在下表中对它们总结一下: Class/Interface 说明 LoaderManag

如果写一个android桌面滑动切换屏幕的控件(二)

在viewgroup执行: public void snapToScreen(int whichScreen) { whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1)); boolean changingScreens = whichScreen != mCurrentScreen; mNextScreen = whichScreen; int mScrollX = this.getScrollX(); fin

Android 中Webview 自适应屏幕

随笔 - 478  文章 - 3  评论 - 113 Android 中Webview 自适应屏幕 webview中右下角的缩放按钮能不能去掉 settings.setDisplayZoomControls(false); //隐藏webview缩放按钮 让Webview加载的页面居中显示有我知道的几种方法 第一种方法: WebSettings settings = webView.getSettings(); settings.setLayoutAlgorithm(LayoutAlgorith

Android应用如何支持屏幕多尺寸多分辨率问题

作为Android应用程序开发者都知道android是一个"碎片化"的世界.多种系统版本.多种尺寸.多种分辨率.多种机型,还有不同的厂商定制的不同ROM,你开发的应用会在不可预期的手机上报错.这给开发适配带来不小的难度.这篇文章会告诉我们怎么解决这个问题. 1.Android碎片化 1.1.android系统版本 Android更新较大的版本如下: 上面只有当前可用版本,Android L作为开发者版本没有出现其中,未来会有更多的版本.下图给出Android各个版本的占有率,这个是go