当前位置: 首页 > 知识库问答 >
问题:

是否需要同时实现LoaderCallbacks和OnLoadCompleteListener来获取ContentProvider中的更改通知?

盖昊东
2023-03-14
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);
    }
};

共有1个答案

秦哲瀚
2023-03-14

实现两个监听器是一个非常糟糕的想法:

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)

所以实际上这个问题的答案是:

不必同时实现两个监听器。

 类似资料:
  • 问题内容: 我正在使用包裹在FileReader周围的BufferedReader读取本地文件: 我需要close()的为好,或将包装处理这个问题?我看过代码,人们在这里做这样的事情: 从Servlet调用此方法,并且我想确保我没有打开任何句柄。 问题答案: 没有。 根据javadoc为和关闭流 以及

  • 假设我有一条消息 并且我想将更改为。我真的必须更改数字吗?(例如为4和不建议使用3)。 我和一个朋友正在讨论这个问题。他在Protobuff方面更有经验(我是新手),但从我阅读的文档来看,我实际上不明白为什么有必要这样做。 虽然这些文件没有直接解决我所看到的问题,但我的理由如下: 上述内容可能会序列化为 反序列化基本上可以理解为 哦,好的,那是1,所以读取接下来的32位 哦,好的,那是3,所以把接

  • 问题内容: 可以在本地运行JAR文件。下一步是在另一台PC上运行它。 问题是运行JAR文件是否需要JRE,JDK或两者都需要? 问题答案: JDK包含JRE。 大多数程序仅需要JRE(Java运行时环境),但是某些程序在运行时需要编译器,在这种情况下,您需要JDK。 如果您拥有JDK,则也不需要JRE。

  • 问题内容: 我有两个线程,我想确保我在LinkedBlockingQueue上正确进行了同步。这正确吗?还是不需要在(messageToCommsQueue)上进行显式同步? 宣言: 方法一: 方法二: 问题答案: 是的,没有必要。JavaDoc说: BlockingQueue实现是线程安全的。

  • 我对同步块有一些疑问。在提问之前,我想分享另一个相关帖子链接的答案,以回答相关问题。我引用彼得·劳里的同一个答案。 > <块引号> 同步确保您对数据有一致的视图。这意味着您将读取最新值,其他缓存将获得最新值。缓存足够智能,可以通过特殊总线相互通信(JLS不需要,但允许)该总线意味着它不必触摸主存储器即可获得一致的视图。 如果您只使用同步,则不需要Volatile。如果您有一个非常简单的操作,而同步

  • 问题内容: 假设我检索一个实体并使用setter修改了它的状态: 是否有可能检索已更改的字段数组? 在我的例子的情况下,我想检索结果 PS:是的,我知道我可以修改所有访问器并手动实现此功能,但是我正在寻找一些方便的方法 问题答案: 您可以使用 获取。 然后只需通过触发变更集计算(仅适用于托管实体)。 您也可以使用类似的方法,例如,如果您确切知道要检查的内容而无需遍历整个对象图。 之后,您可以用来检