2017-07-17 14 views
0

弱い参照を持つ私のシングルトンクラスです。弱い参照を持つJavaシングルトン

public class HandheldMapViewProvider { 

    private static WeakReference<HandheldMapViewProvider> mInstance = null; 

    private HandheldMapViewProvider(){ 

    } 

    public static synchronized WeakReference<HandheldMapViewProvider> getInstance(){ 
     if(mInstance == null){ 
     mInstance = new WeakReference<HandheldMapViewProvider>(new HandheldMapViewProvider()); 
     } 
     return mInstance; 
    } 

    public void onprint(String data){ 
     Log.D("TAG",data) 
    } 


} 

上記のクラスの使用は次のとおりです。

private WeakReference<HandheldMapViewProvider> hereMapViewProvider; 

public void onprint(){ 
    hereMapViewProvider = HandheldMapViewProvider.getInstance(); 
    hereMapViewProvider.get().onprint("somevalue"); 
} 

方法初めてアプリが時々()取得によるクラッシュを取得onprint呼び出している間はnullです。

私はそれが間違っています。それはずっと起こっていない。

解決策は次のとおりです。

public static synchronized HandheldMapViewProvider getInstance(){ 
    HandheldMapViewProvider mapProvider = mInstance == null ? null :mInstance.get(); 

    if(mapProvider == null){ 

     mInstance = new WeakReference<HandheldMapViewProvider>(mapProvider =new HandheldMapViewProvider()); 
    } 

    return mapProvider; 

    } 
+0

あなたの主な不具合は、最初にシングルトンパターンを起こしています。 https://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons –

+0

どこからコードの最後の部分を呼び出しますか? –

+0

アクティビティから@EnamulHaque。ほとんど同じコードが完璧に動作しています。私はいつかnullになっています。 –

答えて

0

問題は、あなたがWeakReferenceとしてHandheldMapViewProviderを格納していることです。 ガーベッジコレクタは値を消去し、get()がnullを返すようにします。

この現象を回避するには、の実装を削除し、HandheldMapViewProviderを「通常の」静的フィールドとして保存してください。

0

弱参照オブジェクトは、参照対象がファイナライズ可能、ファイナライズ済み、再利用されないようにしません。

ガベージコレクタは、特定の時点でどのオブジェクトが弱く到達可能かを判断します。その時点で、そのオブジェクトへのすべての弱い参照と、強くて柔らかい参照の連鎖を通じてそのオブジェクトに到達可能な他の弱く到達可能なオブジェクトに対するすべての弱い参照を、原子的にクリアします。同時に、以前に弱く到達可能なオブジェクトのすべてをファイナライズ可能にすることを宣言します。

弱参照を使用すると、同時に、または後で、参照キューに登録されている新しくクリアされた弱参照がエンキューされます。

起こるのだろうときに我々は知らない...フォームのガベージコレクタが起きます。..

あなたはクラッシュ回避しようとするcatchブロックを使用して、コードを保存することができます。..

public void onprint(){ 
    hereMapViewProvider = HandheldMapViewProvider.getInstance(); 
    try{ 
     hereMapViewProvider.get().onprint("somevalue"); 
    }catch(Exception e){ 
     Log.e("Err", e.toString()+""); 
    } 
} 
+0

これはソリューションの最終的な回避策です。 –

+0

こんにちは...別の解決方法がありますか?もしあれば共有してください。 –

+0

はい、ソリューションを共有します。 –

0

解決策は次のとおりです。

public static synchronized HandheldMapViewProvider getInstance(){ 
HandheldMapViewProvider mapProvider = mInstance == null ? null :mInstance.get(); 

if(mapProvider == null){ 

    mInstance = new WeakReference<HandheldMapViewProvider>(mapProvider =new 
    HandheldMapViewProvider()); 
} 

return mapProvider; 

} 
関連する問題