其他分享
首页 > 其他分享> > android-使用AsyncTask进行“实时”搜索?

android-使用AsyncTask进行“实时”搜索?

作者:互联网

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

由于搜索可能需要一段时间,因此我需要在后台进行搜索,并允许新的按键重新启动搜索.就是说,用户按下“ a”(代码开始搜索“ a”),然后按下“ b”-代码不会等待“ a”搜索结束,而是开始搜索“ ab”,而是停止“ a”搜索,然后开始新的“ ab”搜索.

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

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

>这是一个聪明的方法吗?还是您会采取另一种方法?

TIA

解决方法:

首先,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个字符后才开始.但是,优点是它将大大减少您服务器上的访问量.

标签:android-asynctask,android
来源: https://codeday.me/bug/20191208/2095225.html