私はアプリの回転をフレンドリにしようとしていますが、カーソルを保存する際に問題が発生しています。カーソルを方向変更に耐えられるようにするにはどうすればよいですか?
カーソルはListView
に表示される約13k +行のデータを保持しているため、構成が変更されるたびに再クエリを実行するとかなりの時間がかかります。私の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()
を介してそれを得ることはすでに閉鎖されています。
どのようにしてカーソルを方向変更に耐えられるようにすることができますか?お手伝いありがとう!
EDIT: Romainの回答に基づいて、私はすべてstartManagingCursor()
をコメントアウトしました。私はドットを結びつけて、それについて考えるべきだった!とにかく、私のアプリは今、1回転で生き残っていますが、元の向きに戻してもそれはクラッシュします。私のデバッグを続け、私が見つけたものをあなたに知らせます。
EDIT2: 新しいエラーの原因がわかっていると思います。私は新しいカーソルを返すFilterQueryProvider
を実装しました。私がしたのは、そのフィルターの結果をオリジナルのCursorに割り当てることでした。これまで働いていたようだ。
はい!私は管理されたカーソルを使用しています。私はすべての私の 'startManagingCursor()'をコメントアウトしようとしましたが、これまでのところアプリはポートレートからランドスケープに変わりなく生き残っています。しかし再びポートレートに戻すと、アプリケーションがクラッシュします(原因:java.lang.IllegalStateException:close SQLiteClosableで参照を取得しようとしました)。より多くのデバッグを試みますが、この回答は間違いなく助けになりました!ありがとうロマン!私は何が起こったのかを私のテストに報告します。 – Zarah