解决did not call through to super.onDestroy()

本文介绍了一个在Android开发中关于Fragment的常见错误——未调用super.onDestroy()引发的SuperNotCalledException异常,并给出了修复建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题原因:
在onDestroy函数中,删除掉了super.onDestroy()代码所导致的问题。

04-13 19:26:26.529: E/AndroidRuntime(15242): FATAL EXCEPTION: main
04-13 19:26:26.529: E/AndroidRuntime(15242): Process: xxx, PID: 15242
04-13 19:26:26.529: E/AndroidRuntime(15242): android.support.v4.app.SuperNotCalledException: Fragment MakeFragment{3d3c209c #1 id=0x7f090118} did not call through to super.onDestroy()
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.support.v4.app.Fragment.performDestroy(Fragment.java:1722)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1056)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1201)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:639)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.os.Handler.handleCallback(Handler.java:739)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.os.Handler.dispatchMessage(Handler.java:95)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.os.Looper.loop(Looper.java:135)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at android.app.ActivityThread.main(ActivityThread.java:5312)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at java.lang.reflect.Method.invoke(Native Method)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at java.lang.reflect.Method.invoke(Method.java:372)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-13 19:26:26.529: E/AndroidRuntime(15242):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

解决方法:

加上super.onDestroy()代码即可解决问题。

@Override
public void onDestroy() {
    super.onDestroy();
    ...
}

相同的问题,在重写 onStart()、onStop()、onResume()、onPause()、onDestroy() 等函数时也要留意此问题。

<think>好的,用户遇到了一个Android开发中的错误,问题是在重写onDestory方法时,IDE提示“Method does not override method from its superclass”。首先,我需要确定这个错误的原因。通常,这种错误是因为方法名拼写错误,或者方法签名不正确,导致编译器无法识别这是对父类方法的重写。 用户提供的代码中,方法名写成了onDestory,而正确的方法名应该是onDestroy。注意到用户可能不小心将“Destroy”拼写成了“Destory”,字母顺序有误,特别是中间的“s”和“t”的位置可能颠倒了。这时候,编译器无法找到父类中的onDestory方法,因此认为该方法并没有覆盖父类的方法,从而报错。 接下来,我需要检查用户提供的代码示例。用户展示的代码段是: @Override protected void onDestory(){ super.onDestroy(); mMapView.onDestroy(); } 这里明显可以看到方法名拼写错误,正确的方法名应为onDestroy,而不是onDestory。因此,用户需要更正方法名的拼写。 此外,还需要检查方法签名是否正确。onDestroy方法的正确签名是protected void onDestroy(),用户在此处的拼写错误导致了方法签名不一致,因此@Override注解会报错,因为实际上并没有正确覆盖父类的方法。 还可能存在的其他问题包括:是否在正确的生命周期方法中调用,比如onDestroy是Activity的生命周期方法,用户是否在Activity子类中正确重写,或者是否在Fragment中错误地重写。但根据用户提供的代码,mMapView.onDestroy()通常是在Activity的onDestroy中调用来释放地图资源,因此推测用户是在Activity子类中操作。 另外,用户是否有正确继承自Activity或AppCompatActivity?如果用户的类没有正确继承,比如误继承其他类,也可能导致无法找到onDestroy方法。但根据常见情况,拼写错误是最可能的原因。 总结下来,用户需要做的是: 1. 更正方法名的拼写,将onDestory改为onDestroy。 2. 确保方法签名正确,即protected void onDestroy()。 3. 检查是否在正确的上下文中重写方法,比如在Activity或Fragment中。 4. 确保调用了super.onDestroy()以正确执行父类的生命周期处理。 可能还需要提醒用户,在Android开发中,生命周期方法的正确拼写非常重要,因为任何拼写错误都会导致方法无法被系统正确调用,进而引发资源泄露或其他问题。此外,使用IDE的自动补全功能可以帮助避免这类拼写错误,比如在输入@Override时,IDE通常会提示可重写的方法,选择正确的方法名即可自动生成正确的方法签名。 另外,用户可能是在处理地图组件(如百度地图或Google Maps)时遇到这个问题,因为通常需要在onDestroy中调用地图视图的onDestroy方法。因此,确保在正确的位置释放资源也是很重要的,但首要问题是先解决拼写错误,使方法能够正确重写。 最后,建议用户在修改代码后,清理并重新构建项目,以确保所有更改生效,并且没有残留的编译错误。如果问题仍然存在,可能需要进一步检查类继承结构或导入的包是否正确。</think>### **问题分析** 当出现 `Method does not override method from its superclass` 错误时,表示你尝试用 `@Override` 注解标记的方法并未实际覆盖父类中的方法。以下是针对 `onDestory()` 方法的具体原因和解决方案: --- ### **1. 方法名拼写错误** - **错误原因**: `onDestory()` 方法名拼写错误(`Destory` 应为 `Destroy`),导致无法匹配父类(如 `Activity` 或 `Fragment`)中的 `onDestroy()` 生命周期方法。 - **解决方案**: 修正方法名拼写,确保与父类方法完全一致: ```java @Override protected void onDestroy() { // 正确拼写:onDestroy super.onDestroy(); mMapView.onDestroy(); // 例如百度地图的销毁操作 } ``` --- ### **2. 方法签名不一致** - **错误原因**: 方法签名(参数、返回值、访问修饰符)与父类方法不一致。例如: - 父类方法:`protected void onDestroy()` - 子类误写为:`public void onDestroy(int param)` - **解决方案**: 保持方法签名与父类严格一致: ```java @Override protected void onDestroy() { // 必须与父类方法签名一致 super.onDestroy(); // 先调用父类方法 // 自定义逻辑(如释放资源) } ``` --- ### **3. 未正确继承父类** - **错误原因**: 如果当前类未直接继承 `Activity`、`Fragment` 等包含 `onDestroy()` 的类,尝试重写该方法会报错。 - **解决方案**: 确认类的继承关系,例如: ```java public class MainActivity extends AppCompatActivity { // 正确继承 Activity @Override protected void onDestroy() { super.onDestroy(); // 逻辑代码 } } ``` --- ### **4. 父类方法已被弃用** - **错误原因**: 某些旧版本父类的 `onDestroy()` 方法可能已弃用,导致重写时触发警告或错误。 - **解决方案**: 检查父类文档(如 [Android官方文档](https://developer.android.com/reference)),使用最新的生命周期方法。 --- ### **完整代码示例** ```java public class MapActivity extends AppCompatActivity { private MapView mMapView; // 假设是百度地图控件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); mMapView = findViewById(R.id.map_view); mMapView.onCreate(savedInstanceState); // 地图初始化 } // 正确重写 onDestroy() @Override protected void onDestroy() { super.onDestroy(); mMapView.onDestroy(); // 销毁地图资源 } } ``` --- ### **错误排查表** | 现象 | 检查点 | 解决动作 | |--------------------------------------|--------------------------|-------------------------------| | 方法名拼写错误 | `onDestory` → `onDestroy` | 修正拼写 | | 方法签名不一致(参数、返回值) | 对比父类方法签名 | 保持完全一致 | | 类未继承 Activity/Fragment | 检查 `extends` 声明 | 继承正确的父类 | | 父类方法已弃用 | 查阅官方文档 | 使用替代方法 | --- ### **总结** 1. **严格检查拼写**:生命周期方法名(如 `onCreate`, `onDestroy`)需完全正确。 2. **依赖IDE提示**:输入 `@Override` 后,Android Studio 会提示可重写的方法列表,直接选择可避免拼写错误。 3. **继承关系清晰**:确保类继承自 `Activity`、`AppCompatActivity` 或 `Fragment`。 若问题仍存在,尝试 **Build → Clean Project** 清除缓存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值