2017-06-04 15 views
2

私はContagにDaggerを注入することが可能であることを知っています。例はherehereです。コンテキストにDaggerを挿入する必要がありますか?

一方、リークを避けるために静的変数にコンテキストを配置しないことについては、多数の記事があります。 Androidスタジオ(糸くず)もこれについて暖かいです:

Androidのコンテキストクラスを静的フィールドに配置しないでください。これは私がダガーでコンテキストを注入することにより、我々はシングルトンクラスでそれを置いているので、コンテキストが何らかの形で静的であることを理解し メモリリークである(ともインスタントランを破る)

。これはリントの警告に反していませんか?

コンテキストを注入すると、何らかの理由でそれを必要とする他のクラスにさらに渡すことができるように、不要な複数のクラスに渡す必要がなくなるため、よりクリーンなコードが作成されるようです例えばリソースを取得する)。

これは、何らかの望ましくないリークや糸くずが何らかの原因で発生する可能性があることを心配しています。

+1

私はアプリケーションのコンテキストを提供する傾向があります。 – EpicPandaForce

+1

「@ Singleton」コンポーネントは静的変数に格納しない限り、単なるPOJOであり、静的ではないことを指摘したいと思います。したがって、アプリケーション内のアプリケーションへの参照を持つシングルトンAppComponentを保持すると、同じライフサイクルを共有するため、「静的」ではありません –

+0

ここでは静的に使用されている可能性があります。しかし、シングルトンコンポーネントによって作成されたオブジェクトは、アプリケーションライフサイクル全体にわたって存続します。これは、ライフサイクルが短いこのコンポーネント(アクティビティのコンテキストなど)に決して何かを提供してはならないと考えています。 – fhsilva

答えて

3

あなたが間違ったコンテキストの注入を防止するためにアサーションを使用することができますメモリリーク:

public class MyActivityHelper { 
    private final Context context; 

    @Inject 
    public MyActivityHelper (Context context) { 
     if (context instanceof Application) { 
       throw new IllegalArgumentExecption("MyActivityHelper requires an Activity context"); 
     } 
    } 
} 

代わりにあなたはあなたが誤ってアクティビティーコンテキストを必要とするアプリケーションのコンテキストを注入しない2つを区別するためにダガー2つの修飾子を使用することができます。 、ダガー2 @Singeltonは必ずしも静的参照ではないデビッドさんのコメントどおり、また

@Inject 
public class MyActivityHelper (@Named("activity") Context context) { 

注:その後、あなたのコンストラクタは次のようになります。

+0

@Named修飾子は間違ったコンテキストを使わないようにすることをお勧めします。私はまだこれを試していますが、ディスカッションから得たのは、アクティビティスコープのコンポーネントを格納せず、アプリケーションコンポーネント(シングルトンスコープを持つ)だけを格納することです。これは、Singletonよりも小さいが、Activityよりも大きいスコープの問題を依然として残している。これらはアクセスする場所に格納する必要があり、慎重に管理する必要があります。 – fhsilva

2

アクティビティのライフタイムより長い間、アクティビティコンテキスト(アクティビティはコンテキスト)を保存/参照しないでください。正しく言うと、メモリがリークします。アプリケーションコンテキストは、アプリケーションの存続期間がありますので、シングルトンでのストア/参照は安全です。 context.getApplicationContext()を介してアプリケーションコンテキストにアクセスします。あなたがAndroidのライフサイクルを認識していると、アプリケーション・コンテキストおよびアクティビティとサービスあなたの可能性を心配している場合は、ダガー2.

を使用してコンテキストを注入過失がないのコンテキストを区別するように注意している場合

+0

ありがとうございます。わかった。私は混乱が、注入されたコンストラクタを使う代わりに、POJOオブジェクトがinject()を使っている私の現在のプロジェクトから来ていると思います。したがって、これらのオブジェクトからアクセスするためには、コンポーネントをどこかに格納する必要があります(シングルトンクラス)。アクティビティコンテキストがコンポーネント内にある場合、リークが発生する可能性があります。 – fhsilva

関連する問題