代码之家  ›  专栏  ›  技术社区  ›  Andrew

杀死线程

  •  1
  • Andrew  · 技术社区  · 14 年前

    我创建了一个类,它是线程的扩展。这个类点击一个web服务并在屏幕上抛出一些数据。我不在乎保存这些数据(屏幕显示搜索结果)。

    这意味着,当用户键入时,搜索参数会更改。 . 如何才能做到这一点?我可以用线程还是需要使用一个新对象?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Nemi    14 年前

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

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

    编辑:要展开我的第一点,线程可能很难取消。在这种情况下,事件分派线程需要以某种方式告诉正在运行的线程它需要停止。你可以使用 interrupt this article . 相反,我只需要一个 boolean 可设置为的变量 cancelled

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

    那么让我们来播放一下-如果用户键入一个字符,而您的超时期限因任何原因而过期,并且进行了一个web调用,那么用户在超时期限过期的地方键入另一个字符以便进行另一个web调用呢?如果您的web调用需要5秒,那么第一个线程将继续运行,即使事件分派线程取消它,至少5秒。现在有两个线程进行web调用。

    现在扩大范围。如果用户这样做并生成4或5个线程呢?这是你压倒手机资源的地方。我并不是告诉你们不要继续这样做,只是想指出该地区可能出现的问题。

        2
  •  2
  •   james    14 年前

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

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

        3
  •  0
  •   krtek    14 年前

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

        4
  •  0
  •   DarkLeafyGreen    14 年前

    你的意思是 . 我认为你不需要开始几个线程来处理这个问题。使用android Auto Complete 使用 AutoCompleteTextView .

    此外,不建议通过子类化java线程或实现接口来使用线程。你可以用 AsyncTask