2012-04-04 9 views
1

このトピックを読んだ後、avoiding memory leaks疑問が湧きます。アクティビティコンテキストを使用する必要がある場合の静的コンテキスト参照を避けるにはどうすればよいですか?

アクティビティコンテキストを使用する必要がある場合(例:ポップアップを表示するためにPopupWindowクラスのビューを拡張する)、実際のアクティビティのコンテキストを保持するにはどうすればよいですか?静的コンテキスト参照を避ける必要がある場合は、それを行う唯一の方法は自分のクラスに属性を作成することです。私はそれを行う必要がある実際の活動のコンテキストが必要です他のすべてのクラス?

update-私はgetApplicationContext()が宣言という静的メソッドを持っている私のApplicationクラスのアプリケーションコンテキストでの使用のように、コンテキストを継承していない多くのクラスでは、この実際の活動のコンテキストを使用します。このメソッドは、シングルトンデザインパターンに従い、うまく動作します。

+0

はありますアクティビティがこれらのクラスのインスタンスを作成し、それ自体をコンテキストとして渡すことは可能ですか?コードを共有すると、必要なことを説明するのに役立ちます。 – elevine

+0

私はそうではないと思います。これらのクラスは直接作成されないため、xmlオブジェクトのノードに従って多くのクラスを渡して作成されます。私はこのコードが私の状況を理解できるようになることを願っています:http://pastebin.com/x3LcgF0f – digulino

+0

それでは、HTTPリクエストとXMLの処理は何を引き起こしていますか?それはサービスであるか、アクティビティからユーザーが開始したアクションですか? – elevine

答えて

0

これは、リソースが不足したときにあなたのアクティビティがOSによって殺されるため、アプリケーションがクラッシュするため、コンテキストもnullになります。また、フォアグラウンドでポップアップを表示するときにバックグラウンドアクティビティインスタンスを与える意味がありません活動...何のブログは言うことはどこでもgetApplicationContext(activity.thisを渡す避けるためである)は、仕事をすることができます..あなたはコメントでリンクされたコードから作業

+0

だから、私は何をする必要がありますか?私はそれについて読んで、静的なコンテキストリファレンスを作成したのは良いアプローチではありません。実際には、静的クラスの静的フィールドにアクティビティコンテキストリストを保持しようとしています。私がCustomPopupWindowと呼ぶ別のクラスでは、実際のActivityでテンプレートを膨張させます。この実際のActivityは、静的リストの最後の要素です。 – digulino

+0

@digulino ..ちょうどあなたのポップアップがあなたのアクティビティが終了するまで生きているので、アクティビティを使用してください。アクティビティのリファレンスが解放されますので、メモリリークはありません。 – ngesh

2

は、なぜこれません。

//my main activity 
public class ExampleStaticReferenceActivity extends Activity { 
     //... 

    public void methodCalledWhenUserPressesButton(){ 
     LinearLayout masterLayout = (LinearLayout) findViewById(R.id.masterLayout); 
     //now passing a reference to the current activity - elevine 
     masterLayout.addView(ButtonCreator.createButton(this)); 
    } 
} 

//this class is in another package 
public class ButtonCreator { 
     //added a Context parameter - elevine 
     public static Button createButton(Context context) { 
       Button button; 

       button = new Button(context); 
       //... some configurations for button 
       return button; 
     }  

} 
+0

お返事ありがとうございます!しかし、それほど単純ではありません。前にも述べたように、この作成はそのようなものではありません。私はコードをこのようにして理解を簡素化しています。実際、この作成のために、SASConnectionクラスを持つxmlファイルを受け取り、SASEnvelopeクラスでクラスを作成し、このSASEnvelopeを移植しながら、このXMLファイルの各ノードのビューを作成しています。ですから、このようにしてSASConn、SASEnvelope、そして最後にすべてのクラスにコンテキストを渡す必要があります。私はこのアプローチを避け、別の解決策を得ようとしていました。 – digulino

+0

アーキテクチャを再考して単純化する必要があるようです。 – elevine

+0

さて、私の質問は簡単です。Contextを継承しないクラスで現在のアクティビティコンテキストを保持する必要がある場合、常にメソッドのパラメータに渡す必要があります。あなたがそのクラスの他のポイントでそれを必要とする場合は、このコンテキストのためのプライベートフィールドを作成する必要がありますか?静的コンテキスト参照を取り除きたいのであれば、私はそれをしなければならないと思います。 – digulino

関連する問題