笔者前段时间做了一个相册应用,基本功能包括查询媒体库,按日期倒序分类展示图片,缩放、放大、滑动图片,外部调用相册等功能,感兴趣的同学可以私信我.今天只介绍相册页面系统截图自动刷新的功能.
一提到观察数据变化,刷新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();
}
}