2

Nexus 7 タブレットで実行しているアプリケーションで奇妙な問題が発生しています。カスタム ContentProvider から CursorLoader でデータをロードする 2 つのフラグメントがあります。

アプリケーションを起動すると、横向きモードと縦向きモードの両方で正常に動作し、ローダーはデータを適切にロードします。画面を回転すると問題が発生します。アクティビティと両方のフラグメントが正しく再作成され、期待どおりにローダーが再び開始されます。彼らはデータをロードします(両方のローダーで onLoadFinished が呼び出されることをデバッグしました)が、その後、アプリケーションは次の例外を除いて FC になります。

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

正直なところ、スタックトレースは私のコードへの参照が含まれていないため役に立ちません。また、上記のように、アプリケーションを初めて起動したときに両方のフラグメントが機能し、電話のレイアウトで適切に機能するため、かなり奇妙な問題です。画面の回転後にタブレットのレイアウトでクラッシュします。

編集:

両方のフラグメントで、単に getLoaderManager.initLoader(....); を呼び出すメソッド onActivityCreated メソッドにデータをロードします。

これは私がローダーを作成した方法です:

最初のフラグメント

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

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

    return cursorLoader;
}

2 番目のフラグメント:

@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"
4

3 に答える 3

0

I solved it. In my layout i have a third fragment that loads other data and there was a wrong check on it.

于 2012-08-30T15:39:50.023 に答える