我一直在查看一个流行库的分支,它将ApplicationContext
作为成员字段保存在单例中。这使得应用程序内存密集,因为该过程有点昂贵。一些分支声称通过使用匿名类实现一个接口来为需求中的单例(here和here)提供Context
来解决问题。通常,代码可以总结如下:
界面:
public interface FFbinaryContextProvider {
Context provide();
}
单身人士:
public class FFmpeg implements FFbinaryInterface {
private final FFbinaryContextProvider context;
private static FFmpeg instance = null;
private FFmpeg(FFbinaryContextProvider context) {
this.context = context;
}
public static FFmpeg getInstance(final Context context) {
if(instance == null) {
instance = new FFmpeg(new FFbinaryContextProvider() {
public Context provide() {
return context;
}
});
}
return instance;
}
//get the context like this this.context.provide()
}
}
然后调用Acitivity
中的单身人像FFmpeg.getInstance(this);
我不熟悉这种方法。是否仅仅通过将Context
隐藏在这样的界面下,只要活动被杀死,垃圾收集器就会收集它?有没有什么资源可以在这个问题上阅读更多内容?
虽然我们的目标是,如果目的是防止内存泄漏,WeakReference
是否已经解决了这个问题?在单身人士中使用WeakReference
是否有任何不足之处?