android - 屏幕旋转后使用 CursorLoader 加载数据时出现异常

标签 android android-contentprovider android-loadermanager

我的应用程序在 Nexus 7 平板电脑上运行时遇到了奇怪的问题。 我有两个 fragment ,它们使用 CursorLoader 从我的自定义 ContentProvider 加载数据。

当我启动应用程序时,它在横向和纵向模式下都运行良好,加载程序正确加载数据。当我旋转屏幕时会出现问题:我的 Activity 和两个 fragment 均已正确重新创建,并且加载程序按预期再次启动。他们加载数据(调试时我看到两个加载器都调用了 onLoadFinished),但之后应用程序是 FC,但有以下异常(exception):

08-30 13:10:03.310: E/AndroidRuntime(14964): FATAL EXCEPTION: ModernAsyncTask #4
08-30 13:10:03.310: E/AndroidRuntime(14964): java.lang.RuntimeException: An error occured while executing doInBackground()
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.support.v4.content.ModernAsyncTask$3.done(Unknown Source)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at java.lang.Thread.run(Thread.java:856)
08-30 13:10:03.310: E/AndroidRuntime(14964): Caused by: java.lang.NullPointerException
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1094)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.content.ContentResolver.query(ContentResolver.java:354)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.content.ContentResolver.query(ContentResolver.java:313)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.support.v4.content.CursorLoader.loadInBackground(Unknown Source)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.support.v4.content.CursorLoader.loadInBackground(Unknown Source)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(Unknown Source)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(Unknown Source)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(Unknown Source)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at android.support.v4.content.ModernAsyncTask$2.call(Unknown Source)
08-30 13:10:03.310: E/AndroidRuntime(14964):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-30 13:10:03.310: E/AndroidRuntime(14964):    ... 4 more

老实说,stacktrace 没有帮助,因为它不包含对我的代码的任何引用,而且这是一个非常奇怪的问题,因为如上所述,两个 fragment 在我第一次启动应用程序时都可以正常工作,在手机布局,但屏幕旋转后我的平板电脑布局崩溃。

编辑:

在这两个 fragment 中,我在 onActivityCreated 方法中加载数据,只需调用 getLoaderManager.initLoader(....);

这就是我创建加载器的方式:

第一个 fragment

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    CursorLoader cursorLoader = new CursorLoader(getActivity(), MyContract.CONTENT_URI,
            null, null, null, null);

    return cursorLoader;
}

第二个 fragment :

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    return new CursorLoader(getActivity(), MyContract.CONTENT_URI, null,
            null, null, null);
}

这是我的 CP 内容 uri 的声明:

//MyContract class
public static final Uri CONTENT_URI = Uri.parse("content://" + MyProvider.AUTHORITY + "/items");

//In MyProvider class
public static final String AUTHORITY = "it.rciovati.mypackage.MyProvider"

最佳答案

android.content.ContentResolver.acquireUnstableProvider() 中存在一个错误,该错误于 2013 年 11 月才修复。可以在此处查看该错误的详细信息:

https://bugzilla.mozilla.org/show_bug.cgi?id=904551

本质上,如果 Uri 为 null,则该函数无法处理并会导致崩溃。为了正确支持旧版 Android 版本,您需要确保永远不会传入 null Uri,或者捕获抛出的 NPE。

关于android - 屏幕旋转后使用 CursorLoader 加载数据时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12195867/

相关文章:

android - 加载完成后不调用 LoaderCallbacks.onLoadFinished()

java - 如何为您编写的每个程序创建自己的 Android 开发库?

android - 如何从小部件启动对话框?

android - 如何使用 Content Provider 在两个应用程序之间传递二进制数据?

flutter - 使用 ChangeNotifierProvider 的 Flutter 中的堆栈溢出错误?

android - Android Honeycomb 中的加载程序

android - AutoCompleteTextView 下拉列表中的项目不可见。如何改变他们的颜色..?

android - 使用图库图标启动相机 Intent

android - 如何一次查询到联系人的所有详细信息

android - 加载器将结果传送到错误的 fragment