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

jopen 11年前

在使用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() {                //查询数据加载            }        }  
</div> </div>
这时候,很奇怪的现象就出来了,每次手机解锁后,数据都会重复了,重复加载。经查阅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;            }                }  
</div> </div> 修改后,重复加载的现象解决了,究其原因是没有重写
</div> </div>
    /**             * 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---解决了!

来自:http://blog.csdn.net/cml_blog/article/details/40393909