When it comes to observing data changes and refreshing the UI, we should think of the observer mode. As an album application, we only need to monitor the corresponding system media library changes. The system provides the ContentObserver class to help us realize the functions. See the code below, and the comments are very clear:
//Initialize listening method
private void listenMediaDB() {
if (mScreenObserver == null) {
ScreensHandler screensHandler = new ScreensHandler();
mScreenObserver = new ScreenshotContentObserver(screensHandler);
registerContentObserver();
}
}
//Register to listen to the data change of image media library 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() { //Refresh data and update UI here } }); Log.i(TAG, "registerContentObserver!----------"); } }
//Static inner class to prevent memory leakage static class ScreensHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }
@Override public void onDestroy() { if (mScreenObserver != null) { //Unregistered listening 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 Medium response database */ @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); Log.d(TAG, "onChange() returned: uri = " + uri); //The URL of the screenshot is content://media/external/images/media if (uri.toString().contains("images")) { //Once in a while, onChange2 times will occur after the screenshot. This can be done mCount += 1; // if (mCount == 1) { if (mOnChangeListener != null) { mOnChangeListener.onChange(); // } } } } //After the screenshot refreshes the data, it can be set to 0; public void setOnChangeCount(int count) { this.mCount = count; } public void setOnChangeListener(onChangeListener mOnChangeListener) { this.mOnChangeListener = mOnChangeListener; } public interface onChangeListener { void onChange(); } }