【问题标题】:Geocoder is too slow for searchview地理编码器对于 searchview 来说太慢了
【发布时间】:2021-12-26 04:23:24
【问题描述】:

我有以下代码:

Handler mHandler = new Handler(); //global variable

searchAddress.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {

            mHandler.removeCallbacksAndMessages(null);
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    try {
                        List<Address> foundAddresses = gc.getFromLocationName(newText,10);
                        Log.e("res",foundAddresses.toString());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }, 0);
            
        return true;
    }
});

问题是,当我尝试更改位置名称时,搜索视图字段总是有很大延迟。它不像 for 那样顺利运行。例如在谷歌地图中。 我尝试使用AynchTask,但结果比使用Handler 差得多。

有没有办法针对性能问题进一步优化我的代码? 现在它看起来太丑了,因为当输入一个字符时,在字符出现在搜索视图字段之前总是有 2 秒的延迟。

【问题讨论】:

  • Is there a way to optimize my code much more for performance issue? 好吧,不确定这与性能有多大关系,如果这是一个 api 调用并且 api 调用需要 1-2 秒才能完成,那么您无能为力关于那个
  • @a_local_nobody 我猜谷歌会采取另一种方法吗?因为据我所知,他们使用相同的 api 更快地提供结果
  • 是的,我猜这个实现使用了已经缓存的数据列表,当有人键入时,通过 api 调用搜索以 X 开头的所有位置是没有意义的,但是获取以 X 开头的大量位置列表然后根据用户键入的内容自动完成会更有意义。在这里询问图书馆建议是题外话,不建议人们给出这些建议,但是 Places api 使这种类型的操作非常简单,这取决于您的需要,也许它可以帮助您

标签: android performance handler geocoding searchview


【解决方案1】:

我可以看到一个大问题 - 您的代码并没有真正取消任何 API 调用。假设用户键入“the”。假设他每秒键入 5 个键。所以在时间 t=0 时,他输入了 t。在 t=5ms 左右,您的 onQueryTextChange 将被调用。在时间 t=6ms 左右,您的 onPostDelayed 将运行并进行 API 调用。

现在 h 出现在 t=200ms 内。在 2=205 毫秒时,您取消所有消息。问题是消息已经运行。所以你什么都不取消。这意味着如果他以每秒 5 个键的速度键入,那么您每秒会进行 5 次 API 调用。

您的帖子延迟中的延迟应该足够大,以至于它可以检测到输入的实际延迟,而不是按字符触发。否则你只会有大量的 API 调用。更糟糕的是,如果由于某种原因 API 调用 2 在 API 调用 1 之前返回,那么您会面临竞争条件。对于延迟的良好数字,我会使用打字训练器并查看您的 wpm 是什么,并用它来找出合理的延迟可能是角色平均时间的 2 倍。这是一个很好的第一关。

此外,Google 地图会在本地缓存大量数据。他们不太可能将所有字符逐个字符匹配回服务器。至少他们会使用缓存的本地数据来获得快速的结果,并使用网络来获得更详细的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多