Skip to content
阅读进度

页面退出后,线程任务怎样真正取消? ​

返回 架构与 SDK 目录

标准回答 ​

取消通常是一次合作请求:调用方说“这个结果不需要了”,任务还得检查取消信号、停止可取消的工作并释放资源。还要防止已经返回的旧结果继续写入新页面。

  • Future.cancel(true) 可以请求中断正在运行的线程,不保证所有任务立刻停止。
  • 阻塞调用需使用自身支持的取消或关闭机制;捕获中断异常后应正确传播或恢复中断状态。
  • 区分页面拥有的任务与应用共享线程池,不要在页面退出时随意关闭共享执行器。

通俗例子 ​

用户搜索“杭州”后马上改成“苏州”。取消旧请求,同时给每次搜索分配序号。即使杭州的回调最后才到,也因序号过期被丢弃,避免把苏州结果覆盖掉。

深入解释 ​

**中断为什么只是请求:**线程需要在合适位置检查中断,或让支持中断的等待抛出异常。普通计算不检查,某些底层阻塞又不响应,取消就不会立刻结束所有工作。

**旧结果为什么还要单独拦住:**发出取消时,回调可能已经在路上。给请求带序号或绑定当前页面状态,即使旧结果到达,也能判断它不再属于当前任务而忽略。

易混淆点 ​

只把 Future 标成取消,并不意味着底层网络、硬件操作或所有回调已经结束。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。