外观
页面退出后,线程任务怎样真正取消?
标准回答
取消通常是一次合作请求:调用方说“这个结果不需要了”,任务还得检查取消信号、停止可取消的工作并释放资源。还要防止已经返回的旧结果继续写入新页面。
- Future.cancel(true) 可以请求中断正在运行的线程,不保证所有任务立刻停止。
- 阻塞调用需使用自身支持的取消或关闭机制;捕获中断异常后应正确传播或恢复中断状态。
- 区分页面拥有的任务与应用共享线程池,不要在页面退出时随意关闭共享执行器。
通俗例子
用户搜索“杭州”后马上改成“苏州”。取消旧请求,同时给每次搜索分配序号。即使杭州的回调最后才到,也因序号过期被丢弃,避免把苏州结果覆盖掉。
深入解释
**中断为什么只是请求:**线程需要在合适位置检查中断,或让支持中断的等待抛出异常。普通计算不检查,某些底层阻塞又不响应,取消就不会立刻结束所有工作。
**旧结果为什么还要单独拦住:**发出取消时,回调可能已经在路上。给请求带序号或绑定当前页面状态,即使旧结果到达,也能判断它不再属于当前任务而忽略。
易混淆点
只把 Future 标成取消,并不意味着底层网络、硬件操作或所有回调已经结束。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
job-J07