我有一个活动-MainActivity,在这里我初始化onCreate(…)方法中的成员变量。然后在onStart()和onStop()方法中使用该变量。
很简单吧?现在的问题是,从我的用户那里,我开始获得NullPointerException崩溃报告,这种情况发生在onStop()方法中。
我一直在广泛搜索原因,我知道当android决定释放内存时,静态变量可能会变为null,但我找不到成员变量的情况,它在onCreate()中初始化。代码如下:
public class MainActivity extends ActionBarActivity implements ActionBar.TabListener, SharedPreferences.OnSharedPreferenceChangeListener {
private MySvc mySvc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mySvc = DI.i().getMySvc();
...
}
@Override
protected void onStart() {
super.onStart();
mySvc.start();
}
...
@Override
protected void onStop() {
super.onStop();
//here I get NPE
mySvc.stop();
}
}
}
为了让事情变得更加神秘,我开始只从某些版本的应用程序中获得崩溃报告,然而旧版本在onStart()和onStop()中有相同的行为。
如有任何提示,我将不胜感激。
编辑:
- DI.i().getMySvc();从不返回null,这是根据singleton模式完成的
- MySvc是一个POJO,在DI类中实例化
我需要道歉,我发现问题是由我们的代码引起的。从某个版本开始,我们在onCreate()方法中添加了互联网连接检查,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!isInternetConnectionPresent()) {
return;
}
mySvc = DI.i().getMySvc();
...
}
因此,如果用户离线,他们会得到NPE,因为变量从未初始化,但调用了onStop()。我认为根本原因是错误的错误处理方法。我想要实现的是能够从活动中抛出异常,并拥有能够处理这些异常的通用处理程序。因此,在这种情况下,我会抛出NoInternetConnectionException,处理程序会向用户显示一个有意义的对话框。此外,我想知道当抛出异常时是否会调用其他生命周期方法。
根据MySvc
是什么,android VM可能会根据需要选择GC。使用android的最佳方法是首先检查null,如果需要,再次实例化它,然后执行您想要的操作。一直为我工作,没有性能问题。