Android:成员变量变为null

时间:2014-09-08 09:44:51

标签: android android-activity nullpointerexception instance-variables android-lifecycle

我有一个活动 - 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,它根据单例模式完成。
  • MySvc是一个POJO,在DI类中实例化

2 个答案:

答案 0 :(得分:1)

我需要道歉,我发现问题是由我们的代码引起的。从某些版本我们添加了互联网连接检查onCreate()方法,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    if (!isInternetConnectionPresent()) {
        return;
    }
    mySvc = DI.i().getMySvc();
...
}

因此,如果用户离线,他们就会获得NPE,因为变量从未被初始化,但是调用onStop()。 我认为根本原因是错误处理的错误方法。我想要实现的是能够从活动中抛出异常,并拥有通用处理程序,它们能够处理这些异常。 所以在这种情况下,我会抛出NoInternetConnectionException,处理程序会向用户显示一个有意义的对话框。 另外我想知道在抛出异常时是否会调用其他生命周期方法。

答案 1 :(得分:-1)

根据MySvc的不同,android VM可能会根据需要选择GC。 android的最佳方法是首先检查null,如果需要再次实例化它,然后做你想要的。一直适用于我,没有性能问题。