3

loaderManager を使用して、データベースからいくつかの結果をロードしています。残念ながら、次のコードはデバイスをローテーションした後にStaleDataExceptionを生成します。

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor)
{
    // If we've returned results, then pass them and the webSearches cursor along to be displayed
    if(cursor.moveToFirst())
    {
        // Get a cursor containing additional web searches and merge it at the end of the results cursor 
        MatrixCursor searchesCursor = getWebSearchesCursor(searchTerm, false);
        Cursor[] cursors = { cursor, searchesCursor };
        // TODO: Figure out why merging cursors here causes staledataexception after rotation
        Cursor results = new MergeCursor(cursors);
        // Display the cursor in the ListView
        adapter.changeCursor(results);
    }
    // If no results were returned, then return suggestions for web searches
    else
    {
        // Get a cursor containing additional web searches 
        MatrixCursor noResults = getWebSearchesCursor(searchTerm, true);
        adapter.changeCursor(noResults);    
    }

    // Show the listView and hide the progress spinner
    toggleListView(SHOW);
}

getWebSearchesCursor()を呼び出すと、MatrixCursor が返され、返された結果に付随する追加の検索プロンプトが表示されます。adapter.changeCursor(results)adapter.changeCursor(cursor)に変更するとエラーが修正されることがわかったので、返されたカーソルに MatrixCursor をマージするとエラーが発生するようです。

私の質問は、なぜですか?

結果が返された場合、ユーザーがいくつかの Web サイトで検索を実行できるように、返されたカーソルに項目を追加できるようにしたいと考えています。回転後にこの例外が発生しないように、カーソルをマージするより良い方法はありますか?

4

2 に答える 2

1

この問題は数日前に再び発生し、幸運にも解決策を見つけることができました.

changeCursor() の代わりに swapCursor() を使用する必要があることがわかりました。Androidのドキュメントによると

新しい Cursor にスワップして、古い Cursor を返します。changeCursor(Cursor) とは異なり、返された古い Cursor は閉じられません。

...

指定された新しい Cursor が以前に設定された Cursor と同じインスタンスである場合、null も返されます。

その最後の部分が鍵のようでした。上記の質問で言及されたエラーは、回転後にフラグメントを再描画しようとしたときに閉じられたため、マージされたカーソルでの CursorAdapter チョーキングにまでさかのぼる可能性があります。代わりに swapCursor() を使用することで、CursorAdapter は、その有効性を疑問視して StaleDataException をスローする代わりに、「古い」マージされたカーソルを再利用できました。

ここでいくつかの推測をしています。Android の内部構造に詳しい人なら、私の推論を肯定または否定できるかもしれません。

于 2013-07-25T21:00:37.663 に答える