私はListView
を持っています。これはカーソルからデータを受け入れます。レコードのカーソルの位置は、View.setTag()
を介して格納されるため、ユーザーのイベントに応じて取得できます。アクティビティライフサイクルvsビューライフサイクル:NPEを回避する方法は?
public class OrderActivity extends Activity {
private ListView list;
private CursorAdapter adapter;
private SQLiteDatabase database;
public void onResume() {
database = new Database(this).getWriteableDatabase();
// query the db and store the position of the cursor
// as the tag while binding the view in the overridden
// CursorAdapter.bindView()
adapter = new SimpleCursorAdapter(/* code here */);
list.setAdapter(adapter);
}
public void onPause() {
adapter.changeCursor(null);
database.close();
}
private void onClickRowDumpOrder(View row) {
int newPosition = (Integer) row.getTag();
Cursor cursor = adapter.getCursor();
int originalPosition = cursor.getPosition(); // Throws NPE
cursor.moveToPosition(newPosition);
Log.v("tag", "Description: " + cursor.getString(0));
// restore the cursor
cursor.moveToPosition(originalPosition);
}
}
私は活動のライフサイクルの間に/自由なリソースを割り当てるために、私の活動のインスタンスフィールドでのデータベースとアダプタを格納します。私は、新しいデータベースonResume
を作成し、それを閉じます。残念ながら、私は上記の擬似コードで説明された行にNPEがスローされたことをユーザーから多く報告しましたが、再現できません。
cursor
が
null
ですが、それは、クリックイベントへのコールバックだから方法
onClickRowDumpOrder
のみ、
onResume
後に呼び出すことができる場合、私はこれが可能であるか疑問に思うようです
何か間違っていますか? cursor
がnullになるのはどのようなAPIの誤用ですか?カーソルとアダプターがアクティビティー・ライフ・サイクルに収まるように意図されていることを説明する文書がありますか?
UPDATE
私はXMLファイルでを取り除くと、手動SimpleCursorAdapter.bindView
内でリスナーを設定しました。リークを避けるために、私は自分のカスタムAbsListView.RecycleListener
と私のアクティビティの(私はreclaimViews(List<View>)
ですべてのビューを取得します)のリスナーを削除します。これはバグを修正するようですが、ここで私の説明です。新しいビューは、私の活動が最初に起動したとき、それは属性
- 1がフォアグラウンドを離れるので、onPause()はカーソルをnullに設定します。ビューやアクティビティのどちらもガベージコレクションのマークが付いていないため、このアクティビティはViewのリスナーであることに注意してください。これは、Androidクラスの一部のキャッシュで参照されていることを意味します。
- 自分のアクティビティのインスタンス#2が作成され、そのリストビューは幾分リサイクル既に作成されたビューです。データは正しく表示されますが、このビューにはリスナーとしての古いアクティビティ(ヌルカーソル付き)があります。
- ユーザーがビューをクリックすると、インスタンス#1ハンドラがコールされますがnullカーソルがあります。 NPE
この説明は現実的ですが、Androidクラスで関連するコードが見つかりませんでした(AbsListView.RecycleBin
にキャッシュがありますが、ListView自体は再利用されません)。さらに、私はこのバグを再現することはできませんでした。私は最後の2日で報告は受けませんでした(通常、私は数日に数十を得ます)。私の前提を検証できるAndroidスタックには?
NPEを使用しないで、ポートレート/風景の間で電話機を何回も素早く回転できますか? – techiServices
はい、とにかくポートレートモードしか許可されていないので、これは私のアプリとは関係ないので、ユーザがデバイスを回転させるとアクティビティは破壊されません – Raffaele
カーソルを作成するために使用しているコードを投稿してください –