2013-02-19 13 views
0

我有一個應用程序正在使用Loader s得到一個數據庫,該數據庫也正在由IntentService編輯。我通過LoaderCallbacks實現接收來自Loader的數據,該數據工作正常。是否有必要實現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)此調用僅在初始加載之後觸發,而不是在通知之後觸發。我是否也要需要實現一個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方法嗎? – 2013-02-19 17:20:39

+0

它是您自己的內容提供商或其他內容提供商嗎? – ebarrenechea 2013-02-19 17:21:35

+0

@Saksak我已經把這些。 – 2013-02-19 17:22:42

回答

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) 

所以其實這個問題的答案是:

有必要不要來實現這兩個聽衆。

相關問題