【发布时间】:2017-03-02 10:52:28
【问题描述】:
我有一个需要上下文应用程序的库 (aar),因为它使用了一些需要上下文的 API 方法(例如WifiManager)。
我在there 和许多其他主题中看到,实现此目的的常用方法是将上下文作为参数传递给需要它的库对象。 我在阅读this 文章时遇到了问题。该库将由外部客户端使用,因此我想不惜一切代价避免所有空指针异常(您知道规则:如果它可以发生,它会在某个时候发生)。
假设我的库中有一个主入口点,这个类是一个 Singleton 并保存上下文(在 ctor 中或通过 setter)。我希望这个类“托管” Context 并且行为有点像 Application 类:它将为我的库的其他类提供上下文。
如何按照 nfrolov 的文章中描述的原则从“子”类或其他类中访问这个单例类?
让我们看一些(伪)代码,包括 MainSingleton、NetworkManager(也是单例)和 DataProvider 类。
DataProvider 可以是MainSingleton 的成员并且不需要上下文,但NetworkManager 需要上下文才能使用WIFI_SERVICE 和registerReceiver 方法。
然而,DataProvider 需要来自NetworkManager 的信息,要么通过注册一个监听器,要么从MainSingleton 获取数据(就像事件总线一样用于协调子类之间的事情,就像我们可以处理活动和多个片段)。
案例一
public class MainSingleton
{
private static MainSingleton instance = new MainSingleton();
private static Context context = App.getAppContext(); // where the frog do I get that from ?
...
}
问题:由于这是主要入口点,我无法访问此处的“App”,因此它应该作为参数传递给某处,作为设置器。但是随后上下文被初始化为 null ?
案例 2
public class MainSingleton {
private static MainSingleton instance = null;
private Context context;
private MainSingleton(Context context) {
this.context = context;
}
public synchronized static MainSingleton getInstance(Context context) {
if (instance == null) {
instance = new MainSingleton(context.getApplicationContext());
}
return instance;
}
}
问题:每个需要调用 MainSingleton 类的“子”实例也需要一个上下文。
编辑
阅读this 帖子后:我很可能会认为,当嵌入我的 aar 的客户端应用程序正在运行时,我的 MainEntryPoint 永远不会被卸载,将 Context 作为参数传递给 init 方法并保持静态。
【问题讨论】: