我建立遵循檢索數據的IOSched方式的應用,與事實不同的是,我想我會用CursorLoader
而不是ContentObserver
:IntentService和CursorLoader Sychronisation問題
我也被提及雷託的android-protips-location這確實使用CursorLoader
和邏輯流程頗爲相似IOSched,即:
initLoader → startService (serviceIntent) → handleIntent → insert into DB → notifyChange → onLoadFinished → update UI
我所希望看到發生在CursorLoader
返回Cursor
一旦在數據庫上執行了insert
。
目前,片段onActivityCreated
調用initLoader
並在ContentProvider
上運行查詢,此時用當前數據返回該時間點的Cursor
。 但是,當我執行刷新時,似乎onLoadFinished
未被觸發。日誌顯示在ContentProvider
上執行delete
和insert
,但查看日誌顯示notifyChange
在插入時調度。
// in my Fragment:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(0, null, this);
refreshWelcome();
}
public void refreshWelcome() {
Intent i = new Intent(getActivity(), SyncService.class);
i.setAction(SyncService.GET_WELCOME);
getActivity().startService(i);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri queryUri = AppContract.Welcome.CONTENT_URI;
String[] projection = new String[] { Welcome.WELCOME_FIRST_NAME };
String where = null;
String[] whereArgs = null;
String sortOrder = null;
// create new cursor loader
CursorLoader loader = new CursorLoader(getActivity(), queryUri, projection, where, whereArgs, sortOrder);
return loader;
}
//in AppProvider (which extends ContentProvider)
@Override
public Uri insert(Uri uri, ContentValues values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final int match = sUriMatcher.match(uri);
switch (match) {
case WELCOME: {
long rowId = db.insertOrThrow(Tables.WELCOME, null, values);
if (rowId > 0) {
getContext().getContentResolver().notifyChange(uri, null);
return uri;
}
}
}
return null;
}
是否有在IntentService中使用CursorLoader的原因? IntentService是一個在獨立線程中執行工作的隊列。爲什麼不直接執行查詢? – jsmith