笔者前段时间做了一个相册应用,基本功能包括查询媒体库,按日期倒序分类展示图片,缩放、放大、滑动图片,外部调用相册等功能,感兴趣的同学可以私信我.今天只介绍相册页面系统截图自动刷新的功能.
一提到观察数据变化,刷新UI,就应该想到观察者模式.而我们是相册应用,只需要监听对应的系统媒体库变化就可以了,系统提供了ContentObserver类来帮助我们实现功能,下面请看代码,注释已经很清楚了:
//初始化监听方法
private void listenMediaDB() {
if (mScreenObserver == null) {
ScreensHandler screensHandler = new ScreensHandler();
mScreenObserver = new ScreenshotContentObserver(screensHandler);
registerContentObserver();
}
}
//注册监听图片媒体库URL的数据变化 private void registerContentObserver() { if (mScreenObserver != null) { Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; getContentResolver().registerContentObserver(imageUri, false, mScreenObserver); mScreenObserver.setOnChangeListener(new ScreenshotContentObserver.onChangeListener() { @Override public void onChange() { //这里刷新数据,更新UI } }); Log.i(TAG, "registerContentObserver!----------"); } }
//静态内部类,防止内存泄漏 static class ScreensHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }
@Override public void onDestroy() { if (mScreenObserver != null) { //反注册监听 getContentResolver().unregisterContentObserver(mScreenObserver); mScreenObserver.setOnChangeListener(null); mScreenObserver = null; } }
public class ScreenshotContentObserver extends ContentObserver { public static final String TAG = "ScreenshotContentObserver"; private int mCount = 0; public static final int DATA_CHANGE = 0x110; private onChangeListener mOnChangeListener; public ScreenshotContentObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); } /** * onChange中响应数据库 */ @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); Log.d(TAG, "onChange() returned: uri = " + uri); //截图的URL为 content://media/external/images/media if (uri.toString().contains("images")) { //截图后偶尔会onChange2次,可以这么处理 mCount += 1; // if (mCount == 1) { if (mOnChangeListener != null) { mOnChangeListener.onChange(); // } } } } //截图刷新数据后,可以set为0; public void setOnChangeCount(int count) { this.mCount = count; } public void setOnChangeListener(onChangeListener mOnChangeListener) { this.mOnChangeListener = mOnChangeListener; } public interface onChangeListener { void onChange(); } }