2012-01-28 15 views
6

クラスAには、インスタンス変数ImageViewを使用しています。現在、ImageViewからクラスAのインスタンスに戻るためにsetTag()を使用しています。私は弱い参照の言及についても聞いた。 ImageViewの親クラスAを取得する最良の方法は何ですか?メンバー画像ビューから親クラスを追跡する

私の使用シナリオでは、画面上でImageViewをドラッグしています。ドラッグされているImageViewについては、クラスAにアクセスする必要があります。これは、あなたが明示的に渡す場合はAのコンストラクタで変数を初期化するためにあなたを強制します

private final ImageView myImageView; 

+0

jusrがあなたの参照(ImageView - > ClassAインスタンスのID)を追跡するために独自のHashSet ? – Olegas

答えて

3

私は、Dalvik VMは循環参照を検出することに問題がないと信じています。

はここでこれを議論Q/Aです:Circular References in Java

ごく単純な実装では、円形 の参照に問題を持っているでしょう。

関連オブジェクトを参照するためにsetTagを使用します。また、ViewでsetTag/getTagを使用することは、Androidのさまざまな最適化を達成するための標準的で推奨されるアプローチです。 いくつかの参照:AndroidのGCは、このような依存関係を検出するために問題を持っている希望の場合、それが動作として

http://www.vogella.de/articles/AndroidListView/article.html#ownadapter_viewHolder

Android Custom Listview

、Androidが動作しません。 目的に合っている場合は、View.setTagを使用してください。

+0

私はsettagが弱い参照であるというウェブ上の確認を探していました。それを見つけることができないようですか? – prostock

+0

ビューの学習ソースコード: 保護されたオブジェクトmTag; public void setTag(最終オブジェクトタグ){ mTag = tag; } –

+0

setTagはWeakReferencesとは関係ありません。しかし、達成しようとしているのであれば、WeakReferenceをタグに入れることができます。それは、WeakReferenceが実際にあなたを最初に得ていることを理解していると言われています。 –

0

循環参照を取り除くための最善の方法は、最終的な変数にインスタンス変数を作ることです新しい呼び出しでImageViewへの参照を使用すると、循環参照の機会を避けることができます。

public A(ImageView iv, ...) { 
    this.myImageView = iv; 
    ... 
    // associate this instance of A with ImageView? 
    this.imageView.setTag(this); 
    ... 
    } 
1

Javaの循環参照は、GCでは問題になりません。これは「到達可能性」と呼ばれる概念のために問題ではありません。

オブジェクト参照は有向グラフ、ノードはオブジェクト、エッジはオブジェクト参照と考えることができます。グラフには、 "ルートノード"と呼ばれる一連のノードがあります。これらは、VM内のあるスレッドが直接アクセスできるオブジェクト(大まかに)です。スタック上の関数呼び出しのローカル変数、クラス内の静的フィールドなど

ガベージコレクションを実行すると、VMはこれらのルートノードから開始し、それらを「使用中」としてマークします。次に、これらの使用中ノードから導出される各エッジ(すなわち、使用中のオブジェクトから参照される各オブジェクト)に対して、使用中であることをマークするなど、何も残されない限りマーク。そして、「使用中」としてマークされていないオブジェクトは、ガベージコレクションを安全に行うことができます。あなたは今、aとbの間で循環参照を持っている

a = new A(); 
a.b = b; 

b = new B(); 
b.a = a 

さて、たとえばあなたには、いくつかの方法にしている、とあなたは、次のコードを持っているとしましょう。これらのオブジェクトは両方とも、スタック上にあるメソッド呼び出しのローカル変数であるため、ルートセットの一部です。

この方法を終了すると、aとbの両方がルートセットに含まれなくなります。そして、あなたが他の場所への参照をしない限り、aまたはbへの参照を保持するものは他にありません。

これで、オブジェクト参照グラフにaとbが含まれているグラフの接続が少し外れてしまいます。彼らはまだお互いの参照を持っていますが、他には何も言及していません。ルートセットから到達できないため、GCは使用されていないことを認識し、ガベージコレクションを行うことができます(互いに参照があっても)。

(これはガベージコレクションのやや単純化した説明ですが、それはまだそれがどのように動作するかの便利/合理的なメンタルモデルであることに注意してください)

だから、短い答えは - 「はい、あなたは循環参照を持っていますしかし、これは問題ではありません。なぜなら、両方のオブジェクトは、どちらももう到達不可能になると収集されるからです。 "

関連する問題