Android:成员变量变为null



我有一个活动-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,如果需要,再次实例化它,然后执行您想要的操作。一直为我工作,没有性能问题。

相关内容

  • 没有找到相关文章

最新更新