
本文共 1533 字,大约阅读时间需要 5 分钟。
如何解决BaseActivity extends FragmentActivity时onDestroy方法导致错误?
在Android开发中,当我们将BaseActivity类继承自FragmentActivity,并且实现onDestroy lifecycle方法时,可能会遇到如下的错误:
错误信息:Attempt to read from field 'android.os.Handler android.support.v4.app.FragmentActivity.mHandler' on a null object reference
问题根源:FragmentActivity已经自带了mHandler字段,在FragmentActivity的onDestroy方法中已经对mHandler进行了处理。如果在子类(BaseActivity)中不慎再次调用super.onDestroy(),会导致对已经销毁的mHandler进行操作,从而引发上述错误。
解决方法:
避免不必要的super.onDestroy()调用:在BaseActivity的onDestroy方法中,通常无需显式调用super.onDestroy(),因为FragmentActivity已经会自动调用父类的生命周期方法。
移除或注释BaseActivity中onDestroy方法中的super.onDestroy():如果其中有显式调用super.onDestroy(),请移除或注释这行代码,避免双重调用。
确保生命周期方法编写规范:
- 如果需要自定义.onDestroy逻辑,确保所有生命周期方法(如onCreate, onVisible, 等)都被正确实现,并且遵循最佳实践。
- 检查FragmentActivity内coe":确保FragmentActivity及其所有依赖库的版本兼容,没有由于版本不一致导致的问题。
- 如果你不需要自定义onDestroy逻辑,建议直接继承自FragmentActivity,并且无需定义onDestroy方法。
- 如果定义了自定义onDestroy,因此请注意父类已经有empty实现,避免不必要的操作。
代码示例:
// 注意:baseactivity类,继承自FragmentActivitypublic class BaseActivity extends FragmentActivity { // 如果有自定义onDestroy逻辑 @Override protected void onDestroy() { // 注:无需显式调用super.onDestroy() // 可自定义销毁逻辑 try { // 销毁资源,释放内存 // 如果需要调用父类方法,可以用以下方式 // 但是这种情况下通常会得到错误;建议不要显式调用 super.onDestroy(); } catch (Exception e) { // log日志处理 Log.d("BaseActivity", "onDestroy过程中出现异常:" + e.toString()); } }}
注意事项:
通过以上方法,你可以避免在BaseActivity中重复调用父类的onDestroy,从而解决无法获取mHandler字段的问题。这也是Android生命周期设计中的一个重要原则,确保生命周期方法的覆盖不引发递归或错误。
发表评论
最新留言
关于作者
