正在使用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-10-08 01:13:26