2011-01-25 5 views
8

私はアプリの回転をフレンドリにしようとしていますが、カーソルを保存する際に問題が発生しています。カーソルを方向変更に耐えられるようにするにはどうすればよいですか?

カーソルは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に割り当てることでした。これまで働いていたようだ。

答えて

4

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

+0

はい!私は管理されたカーソルを使用しています。私はすべての私の 'startManagingCursor()'をコメントアウトしようとしましたが、これまでのところアプリはポートレートからランドスケープに変わりなく生き残っています。しかし再びポートレートに戻すと、アプリケーションがクラッシュします(原因:java.lang.IllegalStateException:close SQLiteClosableで参照を取得しようとしました)。より多くのデバッグを試みますが、この回答は間違いなく助けになりました!ありがとうロマン!私は何が起こったのかを私のテストに報告します。 – Zarah

0

だけmenifestファイル

アンドロイドであなたのアクティビティタグにこの属性を追加します。configChanges =「オリエンテーション| keyboardHidden」

はそれが何かを実装するために、この

必要が解決しないだろう

:) 助けてくれました

+0

こんにちはJavanator!可能な限り、私は変更を処理する "正しい"方法を持っていたいと思います。ドキュメンテーションによると、それは最後の手段でなければなりません。 ;)だから私はこれを解決することを望みましょう。 :D – Zarah

+0

私はあなたの結果を待っています。この単純な解決策は、かつて私の複雑な問題を解決しました。 これも何かのショートカットではありません。それはちょうど私が知っている限り、再びonCreateを呼び出さないようにActivity Managerに指示します。 : – Javanator

+0

[documentation] [1]: '注:設定変更の処理は、システムが自動的にあなたのためにそれを適用しないため、代替リソースを使用することをはるかに困難にする可能性があります。この手法は最後の手段と考えるべきであり、ほとんどのアプリケーションでは推奨されません。 :) [1] http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject – Zarah

関連する問題