2017-07-17 144 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方法的应用程序有时因get()为空而崩溃。

任何想法,我做错了。它并没有一直发生。

解决方法如下。

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

您的主要错误是摆脱了singelton模式摆在首位。 https://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons –

+0

从哪里调用最后一段代码? – 2017-07-17 13:19:35

+0

@EnamulHaque来自活动。大多数相同的代码是完美的。有一段时间我变得空了。 –

回答

0

的问题是,你存储HandheldMapViewProviderWeakReference。 垃圾回收器清除值,所以get()返回null。

要避免此行为,只需删除WeakRreference实施并将HandheldMapViewProvider存储为“常规”静态字段。

0

弱引用对象,它不妨碍它们的对象被定型,定稿,然后回收。

垃圾收集器在某个时间点确定哪个对象很弱可达。那时它会原子地清除对该对象的所有弱引用,以及通过一系列强和软引用可访问该对象的任何其他弱可访问对象的所有弱引用。同时它将宣布所有以前弱可达的物体可以定型。

当我们使用弱引用时,在同一时间或稍后时间,它将使用参考队列注册的新清除的弱引用排入队列。

这是发生形式垃圾收集器...所以我们不知道什么时候会发生..

您可以通过使用try catch块,以避免崩溃保存您的代码..

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

这是解决方案的最终解决方案。 –

+0

嗨...还有其他解决方案吗?如果有的话,请分享。 – 2017-07-27 11:03:43

+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; 

}