2017-12-22 20 views
-1

編集:「重複する質問」は、この質問に適用される回答を提供しません。そこで提供されるアプローチは、両方の警告を取り除くことはありません。また、私の質問には、そこに答えられていない2番目の部分が含まれています。バレーシングルトンを構築するための適切な方法

私は公式のチュートリアル、

https://developer.android.com/training/volley/requestqueue.html#singleton

に応じバレーシングルトンを構築する場合、私は「置かないでくださいと言って

private static VolleySingleton mInstance 

private static Context mContext 

の警告を取得します静的フィールド内のアンドロイドコンテキストクラス "を参照してください。私はこれについて他のStackoverflowの質問を読んだが、私は実際に何が起こっているかを説明するこの警告または答えを取り除く解決策を見出しませんでした。 はい私はこの記事を読んだ: Warning: Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run) しかし、私は該当する答えを抽出することができませんでした。私は実際にここで何かを瞬時に実行したり、漏れたりしないように変更する必要がありますか?

私は、これはジェネリックの略であることを知っている

public <T> void addToRequestQueue(Request <T> request) 

<T>を使用する必要がなぜ私が理解しないもう一つは、ですが、私はそれらを削除した場合、それはまだ動作します。それがそこにある理由は何ですか?

これは私のバレーボールシングルトンで、誰かが警告や冗長性なしにそれを適切に構築するために私にアドバイスをしてください。

public class VolleySingleton { 
private static VolleySingleton mInstance; 
private static Context mContext; 
private RequestQueue mRequestQueue; 

private VolleySingleton(Context context) { 
    mContext = context; 
    mRequestQueue = getRequestQueue(); 
} 

public static synchronized VolleySingleton getInstance(Context context) { 
    if (mInstance == null) { 
     mInstance = new VolleySingleton(context); 
    } 

    return mInstance; 
} 

public RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext()); 
    } 

    return mRequestQueue; 
} 

public <T> void addToRequestQueue(Request <T> request) { 
    getRequestQueue().add(request); 
} 
} 
+0

[警告:静的フィールドにAndroidコンテキストクラスを配置しないでください。これはメモリリークです(また、インスタント実行を中断します)](https://stackoverflow.com/questions/37709918/warning-do-not-place-android-context-classes-in-static-fields-this-is- a-memory) – Zoe

+0

この投稿は、2つの警告のうち1つを取り除くだけです。 2番目は残っています。また、私の質問にはパート2があり、そこでは解決されません。 –

+0

シングルトンは静的コンテキスト内にあり、シングルトンはコンテキストフィールド(静的かどうかは関係ありません)を持っているので、コンテキストフィールドは基本的に静的にアクセス可能です。 – Zoe

答えて

1

だけ明確にするために、この重複しています。私は、コメントにリンクされている質問の中で行われた提案に従って、必要なクラスをAndroid Studioのリント警告なしで書くことができました。ここにスニペットがあります:

public class VolleySingleton { 

    private static VolleySingleton instance; 
    private RequestQueue requestQueue; 

    private VolleySingleton(Context context) { 
    requestQueue = Volley.newRequestQueue(context.getApplicationContext()); 
    } 

    public static VolleySingleton getInstance(Context context) { 
    if (instance == null) { 
     instance = new VolleySingleton(context); 
    } 
    return instance; 
    } 

    public RequestQueue getRequestQueue(){ 
    return requestQueue; 
    } 
} 
+0

ありがとうございます。私は実際に非常に似たようなアプローチを作りましたが、公式のチュートリアルとはまったく異なっているので、それが正しいかどうかはわかりませんでした。これ以外のところでは単に 'VolleySingleton.getRequestQueue.add'という名前ですか? 'addToRequestQueue'メソッドでのポイントが何であるのかまだ分かりません。 –

関連する問題