3

我建立遵循檢索數據的IOSched方式的應用,與事實不同的是,我想我會用CursorLoader而不是ContentObserverIntentService和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上執行deleteinsert,但查看日誌顯示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; 
} 
+1

是否有在IntentService中使用CursorLoader的原因? IntentService是一個在獨立線程中執行工作的隊列。爲什麼不直接執行查詢? – jsmith

回答

0

據我所知,您會在onLoadFinished中收到光標; onCreateLoader返回一個Loader <光標>。

我這樣做,在收到它之後,爲光標設置通知Uri。這對我來說可以。

@Override 
public void onLoadFinished(Loader<Cursor>loader, Cursor data) { 
    Log.v(DEBUG_TAG, "onLoadFinished"); 
    data.setNotificationUri(getActivity().getContentResolver(),yourURI); 
    ((SimpleCursorAdapter) getListAdapter()).swapCursor(data); 
    if (data.getCount() == 0) { 
     Toast.makeText(getActivity(), "no elements",Toast.LENGTH_SHORT).show(); 
    return; 
    } 
<}