2011-01-14 20 views
0

私は奇妙な状況があります。Android:ダイアログが開いているときにアクティビティを閉じる

私は、ダイアログ育て、その後、データベースからいくつかの情報を読んでいます:あなたは、それはまた、それを使用することができますので、私はダイアログにDBaseManagerを渡す見ることができるように 擬似

val = DBaseManager.readValue(i,POS_ONE); 

if(val == 1) 
{ 
    Dialog_Test myDialog = new 
    Dialog_Test (myContext,"",new addListener(),DBaseManager); 
    myDialog.show(); 
} 

を。

そこに私はこのようにそれを使用します。

DBaseManager.readValue(k,POS_TWO); 

など

今、これは、しかし、私はとのダイアログでこれらの行を指して、いくつかのクラッシュログを持っていた、時間の99%を働きますnullポインタ例外。

これは、一部のデバイスで、私のonPauseまたはOnDestoryメソッドが、DBaseManagerをクローズしヌルするメインアクティビティで呼び出されていることを示しています。これらは、1.6,2.2、および2.3のデバイスです。

だから質問はなぜ、どのように防止するのですか?私はクラッシュを防ぐためにいくつかのヌルポインタチェックを追加しましたが、それはまだ理想から遠いです。

UPDATE:私のデバイスでは、少なくとも画面を回転するとアクティビティが再開され、ダイアログが消えます。

答えて

0

おそらく、Dialogの範囲とコードを開く場所によって異なります。デフォルトの動作は、オリエンテーションの変更を明示的に処理してからonOrientationChangedをオーバーライドしない限り、オリエンテーションが変更されたときにアクティビティがライフサイクルを通過することです。アクティビティレベルでダイアログの状態を維持する(クラス変数としてboolean isDialogDisplayedを追加するなど)、onCreateまたはonResumeでダイアログをチェックしてダイアログを再度開くようなことが必要な場合があります。

DBaseManagerオブジェクトがクリーンアップされている限り、私は同様のことを経験しています。大規模なオブジェクトは、あなたがそれらを期待していないときにクリーンアップされます(これらのオブジェクトへのポインタはまだありますが、システムによって何とかしていません)。私はこれらを私のアプリケーションで特定し、ちょっと注意しました。 NULLをチェックして再ロードするのではなく、あなたのコードが変数を無効にしている可能性がある(または遅延読み込みを使用する)可能性があるときだけ、このオブジェクトを遅延ロードしたものとして扱います。直接このオブジェクトにアクセスするのではなく、このオブジェクトを返すメソッドを追加し、nullの場合はそれを確認し、そうであればreloadします。

この2つの問題の両方について、このアクティビティのすべてのライフサイクルメソッドをオーバーライドしてログに記録することができます。オーバーライド内のベースクラスのライフサイクルメソッドを呼び出すことを忘れないでください(つまり、public void onPause() { super.onPause() ...など)!

+0

ありがとうございます、私はそれが大型オブジェクトがクリーンアップされている2番目のケースだと思います。私はすべてを上書きしましたが、現場でしか起こっていないことを再現することはできません。私は、utilルーチンを作成して、提案されているように再オープンして取得すると思います。 – Chris

+0

同じこと...私は再現できず、全く同じタイプの振る舞いで自分のテストで見たことのないバグレポートをフィールドから取得します。厄介なもの。笑 – Rich

関連する問題