zoukankan      html  css  js  c++  java
  • 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开发中。官方文档事实上是非常好的,遵守他们的编写规范,能够使自己少走好多弯路。




    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    【NOI2005T1】瑰丽华尔兹-DP单调队列优化
    【POJ1113】Wall-Graham-Scan算法求凸包
    【POJ1113】Wall-Graham-Scan算法求凸包
    【POJ2774】Long Long Message-求最长公共子串(后缀数组求法)
    【POJ2774】Long Long Message-求最长公共子串(后缀数组求法)
    【POJ2195】Going Home-最小费用最大流模板题
    【POJ2195】Going Home-最小费用最大流模板题
    【POJ1273】Drainage Ditches-最大流问题
    【POJ1273】Drainage Ditches-最大流问题
    codevs 1155 金明的预算方案
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4741366.html
Copyright © 2011-2022 走看看