首页
学习
活动
专区
圈层
工具
发布

杀线
EN

Stack Overflow用户
提问于 2010-11-04 14:17:24
回答 4查看 1.6K关注 0票数 1

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

目前,用户只需键入一个EditText并单击一个搜索按钮。我想删除搜索按钮,并实现类似谷歌的即时搜索,在那里,当你键入,搜索结果得到更新。

这意味着,随着用户类型的变化,搜索参数也会发生变化。我希望能够杀死当前正在运行的线程(如果一个线程当前正在运行),并使用新的搜索字符串生成一个新的线程。如何才能做到这一点?我可以用线程来做吗?或者我需要使用一个新的对象?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-04 15:00:21

这比简单地扼杀线程要困难得多。您可以在线程上调用中断(),但是线程必须定期检查其中断状态并自行终止。

其次,您不希望在用户输入时立即启动线程。您将很快淹没系统的线程产卵。在执行搜索之前,实现100到200毫秒的等待期,这样您就可以合理地确保用户完成了键入。谷歌的服务器可以处理负载,但手机将无法处理。

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

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

那么,让我们把它放出来--如果用户键入一个字符,而您的超时期因任何原因而过期,并且进行了一个web调用,那么用户将键入另一个字符,其中超时时间将到期,从而进行另一个web调用?如果您的web调用需要5秒时间,那么第一个线程将继续运行,即使事件调度线程取消了它,也至少要运行5秒。现在有两个线程进行web调用。

现在扩大这个范围。如果用户执行此操作并生成4或5个线程,怎么办?这是你压倒你的手机资源的地方。我不是要你不要这样做,只是想指出本港可能出现的问题。

票数 2
EN

Stack Overflow用户

发布于 2010-11-04 14:32:35

使用AutoCompleteTextView小部件。从web服务中预取搜索提示,将它们加载到自动完成数组中,并设置其适配器。根据提示的复杂程度,可以选择使用自定义游标适配器。

类似于:

代码语言:javascript
复制
AutoCompleteTextView inputSearch;
String[] autocompleteArray = new String[size of prefetched items];
//fill autocompleteArray with webservice data

inputSearch = (AutoCompleteTextView)findViewById(R.id.inputSearch);
searchAdapter = new ArrayAdapter<String>(context, R.layout.autcomplete_dropdown, autocompleteArray);
inputSearch.setAdapter(searchAdapter);

R.layout.autocomplete_dropdown看起来可能类似于:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<TextView 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:id="@+id/name"
  android:singleLine="false"
  android:textSize="15sp"
  android:paddingLeft="3dip"
  android:paddingRight="3dip"
  android:paddingTop="15dip"
  android:paddingBottom="15dip"
  android:textColor="#000000"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" /> 

在应用程序中进行搜索,搜索的内容有多大?预先加载所有的数据在sqlite和检查更新的数据是否经常从网络?

否则,我会说,你应该限制你的应用程序尝试启动线程的次数。设置某种计时器:看看.

  1. 线程已经在工作了。
  2. 输入自上次以来已更改,或具有非空的搜索值。
  3. 用户甚至在搜索屏幕上。

如果一切正常,请启动一个线程以获得结果。

只是一个想法,还没试过这个

票数 2
EN

Stack Overflow用户

发布于 2010-11-04 14:22:18

创建线程是非常耗费精力的操作。因此,我建议有一个线程,它将随后使用新的搜索字符串调用webservices。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4097546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档