1

これは私のコードではありません。このサイトに到着したばかりで、コードレビューを行っています。

Dialogの拡張であるクラスがあります。シングルトンとして定義されています。

最初の呼び出しで、コンテキストはgetInstanceメソッドに渡されます。受信したコンテキストをコンストラクター内の「スーパー」に渡すクラスをインスタンス化します。次に、それを保存します-他のシングルトンと同じです。

次に、ダイアログが表示されます。ユーザーとの対話後、新しいアクティビティを開始し、「closeDialog」を介してダイアログを閉じます。

ただし、インスタンスの静的ホルダーはまだ存在しているため、まだ生きています。これは、それを作成した(そして、インスタンスの作成時に「getInstance」呼び出しで「super()」に渡された)アクティビティを保持しますか?

インスタンスを他の場所からの呼び出しに使用し、引き継ぐ必要のある値を持っているため、インスタンスは存続します。

私はこのコードが悪臭を放つことを知っていますが、それを再書き込みする(または自分で再書き込みする-より可能性が高い)前に、メモリ(最初のアクティビティ)がリークすることを確認したいと思います。

4

2 に答える 2

2

はい、できます。コードが他のアクティビティを開始する場合は、はい。1つのアクティビティのみが使用された場合、ほとんどの場合使用されません。その理由は、ダイアログはアクティビティコンテキストでインスタンス化する必要があるためです(アプリケーションコンテキストでクラッシュします)。そのアクティビティが破棄されるように設定されている場合、ガベージコレクションは、そのアクティビティへのすべての参照が破棄されるまで、そのアクティビティをクリーンアップしません。このシングルトンダイアログがアクティビティの外部にある場合(これが当てはまるはずです)、アクティビティを参照し続け、GCがそれをクリーンアップするのを防ぎます。リークコンテキストの詳細については、次を参照してください:メモリリークの回避

あなたが言ったように、コードは悪いです、そしてそのようなシングルトンダイアログを使うことは(それがリークするかどうかにかかわらず)まったく間違っています。州間でデータを維持するためのより良い方法があります。

于 2012-05-14T16:02:19.417 に答える
0

Dialogクラス内で作成して保持する代わりにSingleton、そのクラスでダイアログを作成しますが、インスタンスを呼び出し元のクラスにSingleton返します。Dialogしたがって、呼び出しActivityは却下の責任がDialogあり、メモリリークは発生しないと思います。

于 2016-10-19T07:40:09.000 に答える