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-07-29 06:30:09

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

Android监听屏幕解锁和判断屏幕状态

开发后台服务的时候经常需要对屏幕状态进行判断,如果是想要监听屏幕解锁事件,可以在配置里面注册action为 android.intent.action.USER_PRESENT的广播,则可以监听解锁事件.但有时候,在后台执行某个操作时,需要主动判断屏幕的状态,比如是否是亮着的,可以使用PowerManager的isScreenOn方法进行判断,比如屏幕是否开启了自动旋转等. 注册监听解锁广播: 1 2 3 4 5 <receiver android:name="com.home.tests

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

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

android 手机屏幕解锁最多有多少种?

  这个十分有趣的题目出自知乎http://www.zhihu.com/question/24905007/answer/29414497 ,排名第一的知友的答案用python简洁的给出了代码和答案,枉费我用C++ 鼓捣了半天... 不过也不能算是白做,还是有颇多收获的. 先准确描述一下这个问题解决思路: 这题目本质就是计算排列: 定义一个函数 permutation(n.m) :从n个数中选m个进行全排列 我们要计算的就是        1. Σ permutation(9,i) (i从1到9

全局监听SCREEN_ON和SCREEN_OFF的替代方法--监听屏幕解锁事件

在做一个程序的时候,需要时刻保持某一服务是启动的,因此想到了通过监听屏幕SCREEN_ON和SCREEN_OFF这两个action.奇怪的是,这两个action只能通过代码的形式注册,才能被监听到,使用AndroidManifest.xml 完全监听不到.查了一下,发现这是PowerManager那边在发这个广播的时候,做了限制,限制只能有register到代码中的receiver才能接收. view plain private void registerScreenActionReceiver

Android -- Webview自适应屏幕

第一种                                                                                          WebSetting settings = webView.getSettings(); settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); 把所有内容放在webview等宽的一列中.(可能会出现页面中链接失效) 第二种             

Android的Activity屏幕切换动画(一)-左右滑动切换

这段时间一直在忙Android的项目,总算抽出点时间休息一下,准备把一些项目用到的Android经验分享一下. 在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity增加了一个方法: public void overridePendingTransition (int enterAnim, int exitAnim) 其中: enterAnim 定义A

android 设置系统屏幕亮度

android 设置系统屏幕亮度 权限<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission> /*** 获得当前屏幕亮度的模式 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度* SCREEN_BRIGHTNESS_MODE_MANUAL=0 为手动调节屏幕亮度*/private int getScreen

android强制横竖屏幕

http://blog.csdn.net/zhuzeyu5211/article/details/8954641 http://www.th7.cn/Program/java/2012/05/25/77499.shtml android强制横竖屏幕,布布扣,bubuko.com

详解Android中的屏幕方向

详解Android中的屏幕方向 屏幕方向 是对Activity而言的,所以你可以在AndroidManifest.xml 文件中,通过<activity> 标记的screenOrientation 属性进行设定,例如: <activity android:name=".SketchpadActivity" android:screenOrientation="landscape"/><!--让该Activity总是显示为横屏-->