-
28-09-2019 - |
题
我创建了一个是线程扩展的类。此类打击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中检查更新的数据吗?
否则,我会说您应该限制应用程序尝试启动线程的次数。设置某种计时器将:查看是否...
- 线程已经在工作
- 自上次以来的输入发生了变化或具有非空搜索值
- 用户甚至在搜索屏幕上
如果一切正常,请启动线程以获取结果
只是一个想法,没有尝试过
线程创建是非常消耗的操作。因此,我建议有一个线程,随后将使用新的搜索字符串调用WebServices。
你的意思是 自动完成. 。我认为您不需要启动几个线程来处理它。与Android合作 自动完成 并使用 AutoCompleteTextView.
此外,不建议通过子类插入Java线程或实现接口来使用线程。您可以使用 异型 在后台执行耗时的操作。