【问题标题】:"realtime" search using AsyncTask?使用 AsyncTask 进行“实时”搜索?
【发布时间】:2010-11-30 21:47:02
【问题描述】:

我正在编写一个“实时”搜索数据库的应用程序。 即当用户按下字母时,它会更新搜索结果列表。

由于搜索可能需要一段时间,我需要在后台进行搜索并允许新的按键重新开始搜索。所以这是一个用户按下'a'(并且代码开始搜索“a”),然后按下'b' - 代码不会等待“a”搜索结束,然后开始搜索“ab”,而是停止“a”搜索,开始新的“ab”搜索。

  • 为此,我决定在 AsyncTask 中进行搜索。这是一个明智的决定吗?

现在 - 每当检测到按键时,我都会测试是否有 AsyncTask 正在运行。如果我这样做 - 我会发出信号(使用 AsyncTask 中的布尔值)它应该停止。然后设置一个定时器,在 10 毫秒内重新测试 AsyncTask,看它是否终止,并开始新的搜索。

  • 这是一种聪明的方法吗?还是您会采取其他方法?

TIA

【问题讨论】:

  • 如果您从数据库中搜索,您将无法真正停止搜索。真的需要那么长时间吗?如果是,您可能不应该像那样实现动态搜索完成。
  • 您可以运行的 AsyncTask 数量是有限制的。在早期版本的 android 上它很低。在最近的你可以忽略它。

标签: android android-asynctask


【解决方案1】:

首先是的,AsyncTask 是一个很好的方法。我在您的方法中看到的问题是等待观看某些东西死亡的计时器。当您调用 asyncTask 时,请保留它的引用。让它为您保留状态,以便您知道它是在搜索还是已返回。当用户单击另一个字母时,您可以告诉 asyncTask 取消。像这样的:

public void onClick() {
   if( searchTask != null ) {
      searchTask.cancel();
   }

   searchTask = new SearchTask( MyActivity.this ).execute( textInput.getText() );
}

public class SearchTask extends AsyncTask<String,Integer,List<SearchResult>> {
    private boolean canceled = false;

    protected onPostExecute( List<SearchResult> results ) {
       if( !canceled ) {
          activity.handleResults( results );
       }
    }

    public void cancel() {
       canceled = true;
    }
}

这是安全的,因为 onPostExecute() 在 UI 线程上。并且 cancel() 仅从 UI 线程调用,因此不存在线程安全问题,也无需同步。您不必看着线程死亡。只需让 GC 进行清理即可。一旦你删除了对 AsyncTask 的引用,它就会被清理掉。如果您的 AsyncTask 阻塞没关系,因为它只挂起后台线程,并且当超时命中时,它将通过调用 onPostExecute() 恢复。这还可以在不使用计时器的情况下将您的资源保持在最低限度。

有关此方法的注意事项。每次输入新字母时发送一个新请求可能会使您的服务器过载,因为前几个字母会产生最大的搜索结果。要么限制您将从服务器返回的结果数量(例如最多 10-50 个结果),要么等到他们输入足够的字符以降低结果(例如 3)。让用户输入更多字符的缺点是反馈直到 3 个字符才会生效。但是,专业人士是它会大大减少您服务器上的点击量。

【讨论】:

  • 您好,谢谢!这里有一个问题 - 您正在测试 (searchTask!=null) 我看不到它在取消(或完成)后设置为 null 的位置。
  • 主要是第一次没有任务运行的时候。如果您想在任务完成时将其设置为 null,您可以在 Activity.handlResults() 方法中执行此操作,因为 AsyncTask 无法将自身设置为 null。您不会在 onClick() 方法中执行此操作,因为通过将其设置为新的 AsyncTask 将释放先前的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
相关资源
最近更新 更多