Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Loader使用時,屏幕解鎖後,重復加載

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

編輯:關於Android編程

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

 

	static class CouponShopQueryLoader extends
			AsyncTaskLoader> {
		
		private int couponId;
		

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

		@Override
		protected void onStartLoading() {
			
			forceLoad();
		}

		@Override
		public List loadInBackground() {
			//查詢數據加載
		}
	}

這時候,很奇怪的現象就出來了,每次手機解鎖後,數據都會重復了,重復加載。經查閱CursorLoader源碼後發現,原來還是自己太嫩了,loader使用時,沒有嚴格遵守android官方幫助文檔demo的使用方式。經修改後:

 

 

	static class CouponShopQueryLoader2 extends
			AsyncTaskLoader> {

		private List 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 loadInBackground() {
			mData = ds.queryShopByCoupon(couponId, pageNo, PAGE_SIZE);
			return mData;
		}

		/* Runs on the UI thread */
		@Override
		public void deliverResult(List 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 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---解決了!

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved