【问题标题】:Best Practices for Handling Search处理搜索的最佳实践
【发布时间】:2015-09-25 10:07:50
【问题描述】:

我有一个SearchView 设置,并且我有一个使用RetrofitOtto 的松散解耦架构。

我想知道在 Android 或任何一般移动应用程序中搜索的最佳做法是什么(这意味着类似的东西也可以应用于 iOS)。

具体来说,我使用AutoCompleteTextView 来处理我的SearchView 中的建议,并且数据直接来自API。我认为这不是最佳做法,因为每次用户更改 SearchView 中的文本时,都会发起 API 调用。

我正在考虑在 SQLite 中存储一个缓存,然后从那里 ping 结果,但是如果用户想要最直接的数据怎么办?你会怎么处理?那会采用什么模式?

如果您对 Android 中搜索的最佳架构或方法有任何想法,我们将不胜感激。

【问题讨论】:

    标签: android search searchview otto


    【解决方案1】:

    所以要以充分的方式回答这个问题,因为我对这里的其他答案不满意,所以在这个问题上还有几个步骤需要考虑。

    首先,我们需要就如何解决这个问题提出几个问题:

    • 有自动完成功能吗?
    • 搜索范围是什么?
    • 会有缓存吗?

    还有更多问题。

    我可能会首先构建一个自定义适配器来处理搜索中的查询,然后对用户的查询实施积极的缓存。这很重要,因为用户的查询非常重要。只对Autocomplete 使用缓存结果可能是有意义的,实现自动完成并让它在每次文本更改时 ping 服务器非常昂贵。

    可以通过在 Android 中使用 SQLite 助手来完成缓存。这可能很昂贵,但我们正在处理简单的查询对象,(从 API 中应该是这种情况,对象应该是内存或字节大小昂贵)。

    【讨论】:

      【解决方案2】:
      • 首先您必须将该列作为搜索属性的索引。
      • 您只需将该列存储在 sqlite 数据库中。当用户进行搜索时,它用于从您的表中选择选项。
      • 然后在搜索栏中选择的单词之后调用 api 来获取搜索结果。

      【讨论】:

        【解决方案3】:

        我认为在用户停止输入之前进行 API 调用是没有意义的。因此,您可以设置一个延迟,例如 500 毫秒。当用户停止输入时,在 500 毫秒后进行 API 调用并显示结果。

        您可以使用HandlerpostDelayed 方法来安排搜索API 调用。您可以使用 Handler 来控制消息队列。每次用户键入字符并取消之前的消息时,您都会发布延迟的Runnable。它看起来是这样的:

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            handler.removeCallbacks(searchRunnable);
            handler.postDelayed(searchRunnable, 500);
        }
        

        【讨论】:

        • 是的,我忘了在我原来的问题中添加这个,我也打算放置一个处理程序,因此除非用户停止输入,否则它不会进行 api 调用。我最重要的问题是自动完成和建议,处理它的最佳实践是什么? SQLite?
        • 你的数据源是什么?它是 REST API 吗?当您从服务器获取数据时,您将其存储在缓存中,然后您可以在用户从查询中删除字符时通过过滤来重用它。我认为您不应该在数据库中缓存搜索结果,因为那样您的搜索结果将不会始终是最新的。您可以将其用于离线搜索,但我不会在线使用搜索缓存..
        • 它是一个 REST API,所以您的建议是不要使用 SQLite DB 进行自动完成?我是否应该将自动完成建议存储在 SQLite 数据库中,然后按时间间隔 ping 服务器以获取最新信息?您如何看待该策略?
        • 是否需要支持离线搜索?如果是,那么您肯定需要 SQLite DB。如果不是,则取决于您要查看的功能。例如,如果你有缓存,你可以在用户输入字符时显示它,同时进行 API 调用。得到响应后,使用最新数据更新列表并更新数据库。我不喜欢这个解决方案,因为我不喜欢看到数据时更新数据。我宁愿等待网络响应并首先显示相关数据,然后才将其存储到数据库以供离线使用。
        • 另外,如果您显示数据库中的数据,服务器上的某些项目可能会被删除,您将显示不再存在的结果。如果使用数据库缓存,请确保处理这种情况。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-25
        • 1970-01-01
        • 1970-01-01
        • 2022-07-04
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        相关资源
        最近更新 更多