杀死线程

时间:2010-11-04 14:17:24

标签: android multithreading android-asynctask

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

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

这意味着,当用户输入时,搜索参数会发生变化。 我希望能够杀死当前正在运行的线程(如果当前正在运行)并使用新的搜索字符串生成一个新线程。怎么能实现这一目标?我可以使用Thread执行此操作,还是需要使用新对象?

4 个答案:

答案 0 :(得分:2)

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

类似的东西:

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看起来像:

<?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中的所有数据并经常检查来自Web的更新数据?

否则我会说你应该限制你的应用尝试启动一个帖子的次数。设置某种计时器,它将: 看看......

  1. 线程已经在运行
  2. 输入自上次以来发生了变化 时间或具有非空搜索值
  3. 用户甚至在搜索上 屏
  4. 如果一切正常,请启动一个线程以获得结果

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

答案 1 :(得分:2)

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

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

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

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

所以让我们玩这个 - 如果用户输入一个字符,并且你的超时时间因任何原因而过期并进行网络呼叫,那么用户会输入超时时间到期的另一个字符,以便进行另一次网络呼叫?如果您的Web调用需要5秒钟,那么第一个线程将继续运行,即使事件调度线程取消它,也至少持续5秒。你现在有两个线程进行网络电话。

现在扩展它。如果用户执行此操作并生成4个或5个线程,该怎么办?这是您压倒手机资源的地方。我并没有告诉你不要追求这一点,只是想指出该地区潜在的问题。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您的意思是自动完成。我认为你不需要启动几个线程来处理它。使用android Auto Complete并使用AutoCompleteTextView

此外,不建议通过继承java线程或实现接口来使用线程。您可以使用AsyncTask在后台执行耗时的操作。