Android Handler.removeCallbacksAndMessages(null)的作用

本文介绍了一段在Android Activity的onDestroy方法中使用的代码,该代码通过调用Handler的removeCallbacksAndMessages方法来清除所有待处理的任务和消息,以此来避免Activity退出时可能产生的内存泄露问题。

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

今天看到一段代码,在onDestroy()方法中,使用了下面的代码:

   @Override
    protected void onDestroy() {
        if (handler != null && handler.getLooper() == Looper.getMainLooper()){
              handler.removeCallbacksAndMessages(null);
           }
        super.onDestroy();
    }

察看官方文档有以下说明:
http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages%28java.lang.Object%29

public final void removeCallbacksAndMessages(Object token)

Added in API level 1 Remove any pending posts of callbacks and sent
messages whose obj is token. If token is null, all callbacks and
messages will be removed.

意思是说,如果参数为null的话,会将所有的Callbacks和Messages全部清除掉。

这样做的好处是在Acticity退出的时候,可以避免内存泄露。

Fatal Exception: java.lang.RuntimeException Unable to destroy activity {com.mercusys.halo/com.tplink.mercusys.component.quicksetup.view.secondpart.newvi.AddNewDeviceNewVIActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Handler.removeCallbacksAndMessages(java.lang.Object)' on a null object reference Fatal Exception: java.lang.RuntimeException: Unable to destroy activity {com.mercusys.halo/com.tplink.mercusys.component.quicksetup.view.secondpart.newvi.AddNewDeviceNewVIActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Handler.removeCallbacksAndMessages(java.lang.Object)' on a null object reference at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:6149) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:6181) at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:47) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:180) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:98) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2685) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:230) at android.os.Looper.loop(Looper.java:319) at android.app.ActivityThread.main(ActivityThread.java:8919) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103) 崩溃分析
最新发布
07-02
### Android Handler 延迟执行代码的正确方法 在 Android 开发中,`Handler` 提供了一种简单而有效的方式来调度将在未来某一时刻运行的代码片段。为了实现延迟 1 秒钟后再执行特定任务的目标,可以利用 `postDelayed()` 方法。 #### 正确使用 `postDelayed()` 实现延迟 1 秒执行代码 以下是一段标准的 Java 代码示例,展示如何通过 `Handler.postDelayed()` 方法让一段代码延迟 1 秒后执行: ```java import android.os.Handler; public class DelayExample { private Handler handler = new Handler(); public void executeAfterOneSecond() { // 定义一个匿名内部类作为 Runnable 对象 Runnable delayedTask = new Runnable() { @Override public void run() { System.out.println("This message is printed after one second."); } }; // 设置延迟时间为 1000 毫秒(即 1 秒) handler.postDelayed(delayedTask, 1000); // 延迟 1 秒后执行任务 [^1] } public void cancelDelayedTask() { // 如果需要取消尚未执行的任务,可调用 removeCallbacks() handler.removeCallbacksAndMessages(null); // 取消所有回调和消息 [^2] } } ``` 在这段代码中,`handler.postDelayed(delayedTask, 1000)` 表明我们将传入的一个 `Runnable` 对象安排在未来 1000 毫秒(也就是 1 秒)之后被执行。一旦启动了此类延迟任务,还可以随时通过调用 `removeCallbacksAndMessages(null)` 来终止它,从而避免不必要的资源消耗或逻辑错误。 需要注意的是,尽管理论上设定的时间间隔应当精确无误,但由于操作系统本身的特性以及其他潜在干扰因素的存在,实际达到目标时间点可能会存在一定的偏差 [^3]。因此,在开发过程中需对此有所预期并合理规划程序的行为表现。 此外,值得注意的一点在于,虽然这里讨论的重点放在了基于 `Handler` 的解决方案之上,但实际上还有诸如 `ScheduledExecutorService` 等其他替代选项可用于满足类似的定时需求 [^4]。然而对于大多数常规用途而言,尤其是那些紧密关联 UI 更新操作的情形下,采用 `Handler.postDelayed()` 往往是最直接且高效的选择之一。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值