Android四大组件之ContentProvider

来源:互联网 发布:淘宝服装店学生 编辑:程序博客网 时间:2024/05/17 04:25

Android四大组件之一Contentprovider的两大功能

1.进程间通信

2.数据有变化及时通知使用者

这篇文章讲解数据变化时通知使用者的功能,对于及时需要知道数据变化的场景有很大帮助。

文件下载过程, 使用该监听很好实现对ListView列表进行刷新。
这里贴出来刷新UI相关的代码,下载模块,自己实现就ok了,只要数据表中的数据发生变化,就会回调ContentObserver的onChange(...)方法。

初始化BaseAdapter时,注册监听数据表变化的观察者。


public class ListDownloadDocHandler extends BaseAdapter {    private DownloadObserver localObserver;    private ListDownloadDocHandler listDownloadDocHandler;    public ListDocDownloadAdapter(Context context) {        localObserver = new DownloadObserver(null, listNonDownloadDocHandler);        //注册数据观察者        mContext.getContentResolver().registerContentObserver(ICorporateDocDao.COLUMNS.CONTENT_URI,                true, localObserver);    }    /**     *文档全部下载完,取消数据观察者     *     */    public void unregisterContentObserver() {        mContext.getContentResolver().unregisterContentObserver(localObserver);    }static class ListDownloadDocHandler extends Handler {        WeakReference<ListDocDownloadAdapter> listDocAdapter;        ListDocDownloadAdapter locallistDocAdapter;        public ListNonDownloadDocHandler(ListDocNondownloadAdapter listDocAdapter) {            this.listDocAdapter = new WeakReference<ListDocDownloadAdapter>(listDocAdapter);        }        ...        ...        public void handleMessage(Message msg) {            if (listDocAdapter == null) {                Logger.d(loggerName, "listDocAdapter is null");                return;            }            locallistDocAdapter = listDocAdapter.get();            switch (msg.what) {                case DownloadKeys.DOWNLOADING_TASK:                    locallistDocAdapter.uiRefresh();                    break;                default:                    break;            }        }    }    /**     * 实现子类DownloadObserver继承 ContentObserver接口     *     */class DownloadObserver extends ContentObserver {        private Handler handler;        public DownloadObserver(Uri mediaUri, Handler paramHandler) {            super(paramHandler);            handler = paramHandler;        }            /**     *ICorporateDocDao.COLUMNS.CONTENT_URI数据变化时,回调onChange(...)     */        @Override        public void onChange(boolean paramBoolean) {            super.onChange(paramBoolean);            if (dataList == null || dataList.isEmpty()) {                Logger.d(loggerName, "dataList is null");                return;            }            handler.sendEmptyMessage(DownloadKeys.DOWNLOADING_TASK);        }    }

public class CorporateDocProvider extends ContentProvider {    private final String TAG = "CorporateDocProvider";    private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);    private static final int MEDIA = 1000;    private static final int MEDIA_ID = 1001;    static {        URI_MATCHER.addURI("com.demo.emm", "media_doc", 1000);        URI_MATCHER.addURI("com.demo.emm", "media_doc/#", 1001);    }    @Override    public boolean onCreate() {        return false;    }    @Override    public Cursor query(Uri paramUri, String[] projection, String selection,            String[] selectionArgs, String sortOrder) {        SQLiteQueryBuilder localSQLiteQueryBuilder = new SQLiteQueryBuilder();        int i = URI_MATCHER.match(paramUri);        switch (i) {            case MEDIA:                localSQLiteQueryBuilder.setTables("media_doc");                break;            case MEDIA_ID:                localSQLiteQueryBuilder.setTables("media_doc");                localSQLiteQueryBuilder.appendWhere("content_id = "                        + (String)paramUri.getPathSegments().get(1));                break;            default:                break;        }        Cursor localCursor = localSQLiteQueryBuilder.query(                MDMDatabaseUtils.getInstance(getContext()).openDatabase(), projection, selection,                selectionArgs, null, null, sortOrder);        if (localCursor != null) {            localCursor.setNotificationUri(getContext().getContentResolver(), paramUri);        } else {            Logger.d(TAG, "localCursor == null");        }        return localCursor;    }    @Override    public String getType(Uri uri) {        return null;    }    @Override    public Uri insert(Uri paramUri, ContentValues values) {        SQLiteDatabase localSQLiteDatabase = MDMDatabaseUtils.getInstance(getContext())                .openDatabase();        Uri localUri = null;        int i = URI_MATCHER.match(paramUri);        try {            localSQLiteDatabase.beginTransaction();            switch (i) {                case MEDIA:                case MEDIA_ID:                    long l1 = localSQLiteDatabase.insert("media_doc", null, ensureFile(values));                    if (l1 > 0) {                        localSQLiteDatabase.setTransactionSuccessful();                    } else {                        Logger.d(TAG, "insert media_doc data failure" + values.toString());                    }                    if (paramUri != null) {                        getContext().getContentResolver().notifyChange(paramUri, null);                        localUri = paramUri;                    }                    break;                default:                    throw new UnsupportedOperationException("Invalid URI " + paramUri);            }        } catch (Exception e) {            Logger.d(TAG, e.getMessage());        } finally {            if (null != localSQLiteDatabase) {                localSQLiteDatabase.endTransaction();            }        }        return localUri;    }    @Override    public int delete(Uri paramUri, String whereClause, String[] whereArgs) {        SQLiteDatabase localSQLiteDatabase = MDMDatabaseUtils.getInstance(getContext())                .openDatabase();        int flag = 0;        int i = URI_MATCHER.match(paramUri);        try {            localSQLiteDatabase.beginTransaction();            switch (i) {                case MEDIA_ID:                    String id = (String)paramUri.getPathSegments().get(1);                    if (!TextUtils.isEmpty(id)) {                        String str3 = COLUMNS.CONTENT_ID + " = "                                + (String)paramUri.getPathSegments().get(1);                        if (whereClause == null) {                            whereClause = str3;                        } else {                            whereClause = str3 + " AND (" + whereClause + ")";                        }                    }                    int l1 = localSQLiteDatabase.delete("media_doc", whereClause, whereArgs);                    if (l1 > 0) {                        localSQLiteDatabase.setTransactionSuccessful();                    } else {                        Logger.d(TAG, "media_doc delete fail=" + whereClause + "="                                + whereArgs.length);                    }                    if (paramUri != null)                        getContext().getContentResolver().notifyChange(paramUri, null);                    break;                case MEDIA:                    int l2 = localSQLiteDatabase.delete("media_doc", whereClause, whereArgs);                    if (l2 > 0) {                        localSQLiteDatabase.setTransactionSuccessful();                    } else {                        Logger.d(TAG, "media_doc delete fail=" + whereClause + "="                                + whereArgs.length);                    }                    if (paramUri != null)                        getContext().getContentResolver().notifyChange(paramUri, null);                    break;                default:                    break;            }        } catch (Exception e) {            Logger.d(TAG, e.getMessage());        } finally {            if (null != localSQLiteDatabase) {                localSQLiteDatabase.endTransaction();            }        }        return flag;    }    @Override    public int update(Uri paramUri, ContentValues values, String selection, String[] selectionArgs) {        SQLiteDatabase localSQLiteDatabase = MDMDatabaseUtils.getInstance(getContext())                .openDatabase();        int i = URI_MATCHER.match(paramUri);        localSQLiteDatabase.beginTransaction();        int index = -1;        Uri localUri = null;        try {            switch (i) {                case MEDIA:                case MEDIA_ID:                    int l1 = localSQLiteDatabase.update("media_doc", values, selection,                            selectionArgs);                    if (l1 > 0) {                        localSQLiteDatabase.setTransactionSuccessful();                    } else {                        Logger.d(TAG, "update fail=" + values);                    }                    if (paramUri != null)                        getContext().getContentResolver().notifyChange(paramUri, null);                    break;                default:                    break;            }        } catch (Exception e) {            Logger.d(TAG, e.getMessage());        } finally {            if (null != localSQLiteDatabase) {                localSQLiteDatabase.endTransaction();            }        }        return index;    }    private ContentValues ensureFile(ContentValues paramContentValues) {        return paramContentValues;    }}


AndroidManifest.xml配置文件中设置:

 <provider            android:name="com.polysaas.mdm.dao.impl.CorporateDocProvider"            android:authorities="com.demo.emm" >        </provider>






0 0
原创粉丝点击