我创建了一个是线程扩展的类。此类打击Web服务,并在屏幕上投掷一些数据。我不在乎坚持这些数据(屏幕显示搜索结果)。

当前,用户只需输入EditText即可单击搜索按钮。我想取出搜索按钮,并实现类似于Google的即时搜索的内容,当您键入时,搜索结果会更新。

这意味着,当用户类型时,搜索参数会更改。 我希望能够杀死当前正在运行的线程(如果当前正在运行)并用新的搜索字符串产生新线程. 。如何实现?我可以使用线程做,还是需要使用新对象?

有帮助吗?

解决方案

这比简单地杀死线程要困难。您可以在线程上调用Interrupt(),但是该线程必须定期和自我终止检查其中断状态。

其次,您将不想在用户键入上立即启动线程。您将通过线程产卵快速淹没系统。在进行搜索之前,要实现100-200毫秒的等待时间,以便您可以合理地确定用户完成键入。 Google的服务器可以处理负载,但手机无法做到。

编辑:要扩展我的第一点,线程可能很难取消。在这种情况下,事件调度线程将需要以某种方式告诉其需要停止的运行线程。您可以使用 interrupt 线程中内置的设施,但它往往很敏感 本文. 。相反,我只会有一个 boolean 可以设置为 cancelled 通过一些外部线程。技巧(如该链接中所示)将是您需要定期检查线程是否已被取消,如果这样,您需要手动中止。

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

因此,让我们发挥作用 - 如果用户键入字符,并且您的超时期由于任何原因和网络调用而到期,那么用户键入了超时期限到期的另一个字符,以便进行另一个Web调用?如果您的Web调用需要5秒钟,那么即使事件调度线程取消了至少5秒钟,第一个线程也将继续运行。现在,您有两个线程进行网络呼叫。

现在扩展。如果用户这样做并制作4或5个线程怎么办?这是您不知所措的地方。我不是告诉您不要追求这一点,只是试图指出该领土带来的潜在问题。

其他提示

使用 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. 用户甚至在搜索屏幕上

如果一切正常,请启动线程以获取结果

只是一个想法,没有尝试过

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

你的意思是 自动完成. 。我认为您不需要启动几个线程来处理它。与Android合作 自动完成 并使用 AutoCompleteTextView.

此外,不建议通过子类插入Java线程或实现接口来使用线程。您可以使用 异型 在后台执行耗时的操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top