Android Loader使用時,屏幕解鎖後,重複加載

在使用AsyncTaskLoader時,當手機解鎖後,會重複加載數據,代碼以下:css

	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開發中,官方文檔實際上是很好的,遵照他們的編寫規範,能夠使本身少走好多彎路。



html

相關文章
相關標籤/搜索