Android四大组件之ContentProvider
2015-02-02 16:36
375 查看
Android四大组件之一Contentprovider的两大功能
1.进程间通信
2.数据有变化及时通知使用者
这篇文章讲解数据变化时通知使用者的功能,对于及时需要知道数据变化的场景有很大帮助。
文件下载过程, 使用该监听很好实现对ListView列表进行刷新。
这里贴出来刷新UI相关的代码,下载模块,自己实现就ok了,只要数据表中的数据发生变化,就会回调ContentObserver的onChange(...)方法。
初始化BaseAdapter时,注册监听数据表变化的观察者。
AndroidManifest.xml配置文件中设置:
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>
相关文章推荐
- android四大组件之ContentProvider
- Android的四大组件之ContentProvider总结
- Android 四大组件之一 ContentProvider
- 【Android基础】(4)四大核心组件之ContentProvider
- android开发步步为营之34:四大组件之ContentProvider
- Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
- android四大组件之contentprovider
- 【Android开发日记】之入门篇(九)——Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- android四大组件之ContentProvider
- Android四大组件之ContentProvider自定义
- Android四大组件之一之内容提供者ContentProvider
- Android四大组件之ContentProvider(二)读取设备上的图片、音频和视频
- Android学习日志13__四大组件04__ContentProvider
- Android四大组件之ContentProvider
- 【Android基础入门〖6〗】四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android四大组件之ContentProvider
- Android的四大组件之ContentProvider总结