9

アプリを回転しやすくしようとしていますが、カーソルの保存に問題があります。

カーソルは、に表示される約13k以上のデータ行を保持しているListViewため、構成が変更されるたびに再クエリを実行すると、かなり時間がかかります。私onRetainNonConfigurationInstance()のでは、カーソルを返し、それを介して取得していgetLastNonConfigurationInstance()ます。

ただし、取得したカーソルはすでに閉じているようであるため、アダプタはリストをレンダリングできなくなります。私の理解では、onDestroy()すべてのカーソルが自動的に閉じられるため、カーソルが閉じられました。

カーソルを次のように保存します。

@Override
public Object onRetainNonConfigurationInstance() {
    return myCursor;
}

そして、次のように取得します。

myCursor = (Cursor)getLastNonConfigurationInstance();
if (myCursor == null) {
    // Do some stuff here (access DB, etc)
} else { // we are returning from configuration change
    // Feed the cursor to the adapter
}

誰かがそれを見たい場合、私はスタックトレースを貼り付けています:

01-25 16:57:45.637: ERROR/AndroidRuntime(12976): android.database.StaleDataException: Access closed cursor
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
    01-25 16:57:45.637: ERROR/AndroidRuntime(12976):     at com.test.sample.helper.DictionaryAdapter.bindView(DictionaryAdapter.java:35)
[........More ListView-related errors here..........]

コードをステップスルーしたところonRetainNonConfigurationInstance()、カーソルはまだ開いていますが、カーソルを通過getLastNonConfigurationInstance()した後はすでに閉じていることがわかりました。

カーソルを向きの変更に耐えさせるにはどうすればよいですか?お手伝いありがとう!

編集: ロメインの答えに基づいて、私はすべての私のものをコメントアウトしましたstartManagingCursor()。点をつなげて考えればよかった!とにかく、私のアプリは1回転しても存続しますが、元の方向に戻すとクラッシュします。デバッグを続行し、私が見つけたものをお知らせします。

EDIT2: 私は新しいエラーの原因を見つけたかもしれないと思います。FilterQueryProvider新しいカーソルを返すを実装しました。私がしたことは、そのフィルターの結果を元のカーソルに割り当てることでした。これまでのところうまくいくようです。

4

2 に答える 2

4

おそらく管理カーソルを使用しています。アクティビティが破棄されると、管理カーソルは自動的に閉じられます。管理されていないカーソルに切り替える必要があります。

于 2011-01-25T09:29:28.530 に答える
0

マニフェストファイルのアクティビティタグにこの属性を追加するだけです

android:configChanges="orientation|keyboardHidden"

これを解決します

他に何も実装する必要はありません

:)それは私を助けました

于 2011-01-25T09:33:51.510 に答える