gpt4 book ai didi

android - 杀死线程

转载 作者:行者123 更新时间:2023-11-29 16:25:35 25 4
gpt4 key购买 nike

我创建了一个类,它是 Thread 的扩展。此类访问 Web 服务并将一些数据显示在屏幕上。我不关心持久化这些数据(屏幕显示搜索结果)。

目前,用户只需在 EditText 中键入内容并单击搜索按钮即可。我想取消搜索按钮并实现类似于 Google 即时搜索的功能,在您输入时,搜索结果会得到更新。

这意味着,随着用户键入,搜索参数会发生变化。 我希望能够终止当前正在运行的线程(如果当前正在运行)并使用新的搜索字符串生成一个新线程。如何实现?我可以使用 Thread 来完成还是需要使用新对象?

最佳答案

这比简单地杀死一个线程更困难。您可以在线程上调用 interrupt(),但线程必须定期检查其中断状态并自行终止。

其次,您不希望在用户输入时立即启动线程。您将很快因线程生成而使系统不堪重负。在执行搜索之前实现 100-200 毫秒的等待时间,以便您可以合理地确定用户已完成输入。谷歌的服务器可以处理负载,但手机无法处理。

编辑:扩展我的第一点,线程可能很难取消。在这种情况下,事件分派(dispatch)线程将需要以某种方式告诉正在运行的线程它需要停止。您可以使用线程中内置的 interrupt 工具,但正如 this article 所指出的,它往往很棘手。 .相反,我只需要一个 boolean 变量,它可以被一些外部线程设置为 cancelled。诀窍(如该链接所示)是您需要定期检查线程是否已被取消,如果是,您将需要手动中止。

您将遇到的下一个问题是是否已经对某个外部服务器进行了网络调用。它将阻塞该线程,直到它返回并且该线程将无法杀死自己。这可能需要几秒钟。

让我们来试一试 - 如果用户键入一个字符,并且您的超时期限因任何原因到期并进行了网络调用,然后用户键入另一个字符,超时期限到期,因此进行了另一个网络调用?如果您的 web 调用需要 5 秒,那么第一个线程将继续运行,即使事件调度线程取消它,至少 5 秒。您现在有两个线程进行网络调用。

现在展开它。如果用户这样做并创建 4 或 5 个线程怎么办?这是您压倒手机资源的地方。我不是告诉你不要追求这个,只是想指出领土带来的潜在问题。

关于android - 杀死线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4097546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com