2017-07-17 3 views
0

Voici ma classe singleton avec une référence faible.Singleton Java avec référence faible

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) 
    } 


} 

L'utilisation de la classe ci-dessus est la suivante.

private WeakReference<HandheldMapViewProvider> hereMapViewProvider; 

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

Tout en appelant la méthode OnPrint première application de temps se plantage parfois en raison de get() est nulle.

Toute idée où je me trompe. ça ne se passe pas tout le temps.

La solution est comme ci-dessous.

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

Votre principale erreur est d'annuler le motif singelton en premier lieu. https://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons –

+0

D'où vous appelez les derniers morceaux de code? –

+0

@EnamulHaque de l'activité. Généralement, le même code fonctionne parfaitement. quelque temps je deviens nul. –

Répondre

0

Le problème est que vous stockez HandheldMapViewProvider comme WeakReference. Le garbage collector efface la valeur. get() renvoie null.

Pour éviter ce comportement, supprimez simplement l'implémentation WeakRreference et stockez le HandheldMapViewProvider comme champ statique "normal".

0

Objets de référence faibles, qui n'empêchent pas la finalisation, la finalisation et la récupération de leurs référents.

Le récupérateur de place détermine à un certain moment quel objet est faiblement accessible. À ce moment-là, il effacera atomiquement toutes les références faibles à cet objet et toutes les références faibles à tout autre objet faiblement accessible à partir duquel cet objet est accessible à travers une chaîne de références fortes et douces. En même temps, il déclarera que tous les objets jadis faiblement accessibles peuvent être finalisés. Lorsque nous utilisons une référence faible, alors, en même temps ou à un moment ultérieur, il mettra en file d'attente ces références faibles récemment effacées qui sont enregistrées avec des files d'attente de référence.

Il se produit sous forme Garbage Collector ... Nous ne savons pas quand cela se produira ..

Vous pouvez enregistrer votre code en utilisant bloc catch essayer d'éviter de s'écraser ..

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

Ceci est le dernier travail autour de la solution. –

+0

Salut ... obtenez-vous une autre solution? S'il vous plaît partager s'il y a lieu. –

+0

Oui, partagera la solution. –

0

La solution est comme ci-dessous.

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

if(mapProvider == null){ 

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

return mapProvider; 

}