0

У меня есть приложение, которое использует Loader s для получения базы данных, которая также редактируется IntentService. Я получаю данные от Loader через реализацию LoaderCallbacks, которая работает нормально.Нужно ли реализовать как LoaderCallbacks, так и OnLoadCompleteListener, чтобы получать уведомления об изменениях в ContentProvider?

Я также использую ContentResolver#notifyChange(Uri, ContentObserver) для запуска перезагрузки. Однако это работает, только когда я звоню Cursor#setNotificationUri(Uri).

Я не могу найти ссылку на последний метод в любой документации, и, кажется, на самом деле это может быть причиной аварии: смотри также

IllegalStateException "attempt to re-open an already-closed object" in SimpleCursorAdapter from ContentProvider

Однако без этого вызова на CursorLoaderCallbacks#onLoadFinished(Loader<Cursor>, Cursor) только ударить после начальной загрузки, а не после уведомления. Do I также нужно выполнить OnLoadCompleteListener, чтобы сделать, ну, точно так же?

ContentProvider метод запроса:

class MyContentProvider extends ContentProvider { 
//... 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, 
      String[] selectionArgs, String sortOrder) { 
     SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 
     Cursor query = db.query(getTableName(uri), projection, selection, selectionArgs, null, null, sortOrder); 
     query.setNotificationUri(getContext().getContentResolver(), uri); 
     return query; 
    } 

//... 
} 

Типичные LoaderCallbacks:

LoaderCallbacks<Cursor> mCallbacks = new LoaderCallbacks<Cursor>() { 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     mArticleAdapter.swapCursor(null); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     if(cursor.isClosed()) { 
      Log.d(TAG, "CURSOR RETURNED CLOSED"); 
      Activity activity = getActivity(); 
      if(activity!=null) { 
       activity.getLoaderManager().restartLoader(mFragmentId, null, mCallbacks); 
      } 
      return; 
     } 
     mArticleAdapter.swapCursor(cursor); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     triggerArticleFeed(); 
     CursorLoader cursorLoader = null; 

     if(id == mFragmentId) { 
      cursorLoader = new CursorLoader(getActivity(), 
              MyContentProvider.ARTICLES_URI, 
              null, 
              ArticlesContentHelper.ARTICLES_WHERE, 
              ArticlesContentHelper.ARTICLES_WHEREARGS, 
              null); 
     } 
     return(cursorLoader); 
    } 
}; 
+0

Можете ли вы опубликовать onLoadFinished метод? –

+0

Это ваш собственный контент-провайдер или другой контент-провайдер. – ebarrenechea

+0

@ Саксак Я положил их. –

ответ

1

Реализация обоих слушателей очень плохая идея:

02-19 17:46:25.139: E/AndroidRuntime(24886): FATAL EXCEPTION: main 
02-19 17:46:25.139: E/AndroidRuntime(24886): java.lang.IllegalStateException: There is already a listener registered 
02-19 17:46:25.139: E/AndroidRuntime(24886): at android.content.Loader.registerListener(Loader.java:152) 
02-19 17:46:25.139: E/AndroidRuntime(24886): at android.app.LoaderManagerImpl$LoaderInfo.start(LoaderManager.java:273) 
02-19 17:46:25.139: E/AndroidRuntime(24886): at android.app.LoaderManagerImpl.installLoader(LoaderManager.java:523) 
02-19 17:46:25.139: E/AndroidRuntime(24886): at android.app.LoaderManagerImpl.createAndInstallLoader(LoaderManager.java:510) 
02-19 17:46:25.139: E/AndroidRuntime(24886): at android.app.LoaderManagerImpl.initLoader(LoaderManager.java:563) 

Так ведь ответ на этот вопрос :

Нужно NOT для реализации обоих слушателей.

Смежные вопросы