2011-07-28 14 views
8

one answerは、別のクラスを作成し、静的なMyApplicationオブジェクトを作成してgetメソッドを作成する必要があると考えられます。その後、どのクラスもMyApplication.get()を呼び出してコンテキストを取得できます。非アクティビティクラスからコンテキストを取得する方法は?

他にも清潔な方法はありますか?これは私の状況です:

私はクラスAとクラスBを持っています。クラスAはクラスBのオブジェクトを含んでいます(オブジェクトbを呼び出してみましょう)。クラスAでは、 "b.play()"と呼びます。ただし、クラスBはMediaPlayer.create()メソッドにコンテキストを渡す必要があるため、NULLポインタ例外が発生します。

今まで私はハックを投げつけていました。クラスAからは、「b.play(this)」と呼ばれ、単にコンテキストをBに渡しました。しかし、これはかなり醜いですし、OOPの悪い使い方のようです。

どのような考えですか?

+0

この質問は古いですが、より良い議論と明確な答えは、この重複質問に起こっている:http://stackoverflow.com/questions/7666589/using-getresources-in-non-activity-class – tir38

答えて

8

クラスBでコンテキストを操作する必要がある場合は、クラスAでそれを提供することは問題ありません(再生メソッドのパラメータ、コンストラクタのパラメータなど)。

クラスBに依存関係を提供することで、あなたが貧弱なOOPをやっているとは思いません。

+0

うーん私はそれを守りますが、コンテキストBを渡すことを避けるために、クラスBのコンストラクタ内のコンテキストを渡すと思っています。ありがとう!これまでのところ、このコンテキストビジネスは、私にとってAndroid開発の最も複雑な部分でした〜 –

+1

これは実際には非常に優れたOOであり、テストを容易にします。依存性注入は一般的な設計パターンです。 – jlindenbaum

+0

クラスメソッドに渡すとNullPointerExceptionが発生することがあるので、クラス内の各メソッドに渡すのではなく、コンストラクタにコンテキストを渡すことをお勧めします。 – ChuongPham

2

thisを渡すことは、具体的には、thisがコンテキストを必要とするオブジェクトを作成するアクティビティである場合に実行可能です。場合によっては、Contextをコンストラクタに入れて(例えば、public MyObject(Context context){this.context = context;}のように)、毎回送信する必要はありません。ただし、オブジェクトが複数のアクティビティで共有されている場合、古いアクティビティを使用した場合の動作はテストされていませんが、新しいアクティビティで見ているコンテキストを更新する必要があります。

+4

'コンストラクタにコンテキストを入れて保存します'これはメモリリークを引き起こす素晴らしい方法です。 「古い活動を使用すれば何が起こるかはテストしていませんが、ほぼ確実に例外がスローされ、コンテキストが漏れてしまいます。 – Falmarri

+1

その方法を通過する方が良いですか?コンテキストを複数回渡す際のオーバーヘッドはどうですか? –

+0

@Falmarri:ああ、そうです。コンテキストを閉じるときにコンテキストをnullに設定する必要があります。ただし、到達不可能なクローズドループの参照は、とにかにガベージコレクションの候補になります。 – AlbeyAmakiir

1

私もhereと答えました。

あなたは、例えばContextWrapperas described here.

を使用していることを行うことができます。

public class MyContextWrapper extends ContextWrapper { 

    public MyContextWrapper(Context base) { 
     super(base); 
    } 

    public void someMethod() { 
     // MediaPlayer.create(this, ...) 
    } 

} 
+0

そして、私は 'MyContextWrapper'のインスタンスをどうやって取得しますか?私は最初に、私が後にしていることである 'Context'を渡す必要があります。 – Suhas

9

この問題はAndroidの開発に多くのことを生じているようです。特定のコンテキストへの参照を取得する1つのソリューションは、アプリケーションをサブクラス化し、必要なコンテキストへの参照を取得することです。

public class MyApplication extends Application { 

private Context context; 

@Override 
public onCreate() { 
    super.onCreate(); 
    this.context = getApplicationContext() // Grab the Context you want. 
} 

public static Context getApplicationContext() { return this.context; } 
} 

このソリューションでは、マニフェストでサブクラスの名前を指定する必要があります。

<application 
    android:name=".MyApplication" 
</application> 

これは、非アクティビティクラスでアプリケーションのどこでもこのように使用できます。

MyApplication.getContext(); // Do something with the context! :) 
+0

静的関数からインスタンス変数を返すことはできません。コンテキスト変数を静的にリファクタリングすることはできますが、それはメモリリークの可能性があります。 – winklerrr

+0

参照の初期化されていない値はちょうどnullなので、可能なはずです。そうでなければ、変数は静的宣言されていなければなりません。 :) – Entalpi

+1

静的コンテキストは、メモリリークの可能性があるため避けなければなりません。 – winklerrr

関連する問題