【发布时间】:2018-09-12 05:58:27
【问题描述】:
我有一个非常奇怪的问题,很难描述,所以请在回答之前仔细阅读假设,以避免跳入我已经知道不是的东西
1 - 我有一个从我的服务器登录的 Android 应用程序
2 - 成功登录后,我实例化了一个 Singleton API,它将在活动之间共享,以便向服务器发出请求
3 - 没有登录就无法使用该应用程序
4 - 在我的登录活动中,我的状态非常干净
if(APIFacade.getInstance() != null){
startActivity(new Intent(this,MainActivity.class));
finish();
}else {/*error handling*/}
5 - 在整个 LoginActivityclass 中只有一个对 startActivity 方法的调用,因此如果不检查外观是否为空,就无法启动 MainActivity
6 - 实例化后无法将APIFacade.INSTANCE 设置为null
但即使有所有这些条件,当应用在登录后尝试首次调用 API 时,有时用户会在 MainActivity 上得到 NullPointerException
String url = APIFacade.getInstance().getProfilePicUrl(); //throws nullpointerexception on 5% of the times
APIFacade 类是这样的:
public class APIFacade {
private static APIFacade INSTANCE = null;
@WorkerThread
public APIFacade(Object i, final boolean preLoad) {
INSTANCE = this;
//other stuff
}
public static APIFacade getInstance() {
return INSTANCE;
}
}
我无法在开发环境中重现该问题,所以我只知道这是由于 firebase 上的 crashlytics 仪表板造成的...
我相信我的代码没有泄漏导致这种情况,所以我得到的唯一理论是:当我的应用进入后台时,Android 正在清理内存中的一些变量...
我知道 android 自然会为活动做这件事,但是单身人士呢? 如果是,我能做些什么来解决它?
【问题讨论】:
-
你用的是什么单例?
-
Application.onCreate()总是在应用程序进入前台时被调用,所以尝试在那里初始化INSTANCE。
标签: java android nullpointerexception singleton