【问题标题】:Live Search in Android [closed]Android中的实时搜索[关闭]
【发布时间】:2015-06-05 18:49:22
【问题描述】:

我有以下任务要做,我需要从端点构建实时搜索。

现在,问题是我知道如何去做,但我不知道如何高效地去做。小应用程序应该执行以下操作:

  1. 从特定端点进行实时搜索 - json 请求中包含 2000 多个对象的列表。
  2. 加载时,应用应显示一个微调器。
  3. 刷新自动完成列表视图。

我知道的唯一解决方案如下:

我在添加搜索视图的操作栏中添加了一个菜单。 在活动中,我将有一个带有列表视图的片段(当我想添加一些单击项目时更好),以及当用户搜索某些东西时(例如,“around”,“a”,然后是“ar”等) 然后将向服务器发出一个新请求,并且所有以“a”开头的对象都将加载到列表视图中,然后自动完成将完成它的工作。

这样我需要加载所有包含“a”的数据并从那里过滤。

现在我的问题是每次json文件都需要解析,有可能我只需要3条记录。

作为一种改进,我想以某种方式过滤 json 大文件并仅检索我需要的 json 文件,但我不确定这是否可行,如果可行,成本是多少。

有人知道更好的解决方案吗?

【问题讨论】:

  • 将您的 json 数据保存在 sqlite 数据库中,然后对其执行搜索
  • 您对服务器端组件有任何控制权吗?
  • @LukasKnuth,不,不是。
  • @andrei 好的。来自后端的数据多久更改一次?
  • 如果您确实想要在线搜索,请在此处查看我的答案:stackoverflow.com/a/19860624/2252830,它可能有助于将自动完成文本视图与网络应用调用集成

标签: android json filtering


【解决方案1】:

由于您无法更改服务器端组件,因此您必须让您的客户端更智能。

这里的方法是(如 @pskink 建议的那样)在本地存储数据。如果您在搜索视图中为每个输入/删除的字符发出一个请求,那么您实际上是在对他们的服务器进行 DOS 操作。而且,这会很慢。

挑战是在本地缓存数据,但要保持它足够“新鲜”,这样它就不会从服务器上的数据中转移太多。实现这一点比听起来更难。

我建议在活动打开后立即从后端加载整个 JSON。根据此列表中每个条目的大小,您可能会将它们全部保存在内存中并对其进行过滤(我认为 Tree 可能是一个很好的起点)。

如果您在使用此解决方案时遇到任何性能或内存问题,我建议将数据移动到某种数据库中(它不需要是 SQLite,Realm 也可能很有趣)。当然,同样的挑战也适用于使这些数据保持最新状态。

既然你说他们告诉你,我猜你正在与服务器组件背后的人一起工作。在这种情况下,我发现最好的方法是实施一个可行的解决方案(上述任何一个)并将其展示给他们。如果对他们来说还不够快,请提出建议:

  • 他们可以为您提供一个 API,以便仅获取自给定日期以来的新/更改条目(因此您可以只更新数据库)。
  • 也可以创建一个混合模型:首先过滤您的离线数据,但也向服务器发出请求(使用过滤器参数或其他东西)并混合结果数据。向用户表明您正在获取更多“最新”数据,但向他们展示您已经知道的结果。如果经常删除条目,这可能效果不佳。

【讨论】:

  • 谢谢你的建议,我会分析的。我也考虑过这种方法,因为我在一个项目中使用了相同的方法(没有搜索部分,只是与服务器同步数据)——在 1-2 个月而不是 2 天内开发......
  • 如果您有两天时间,请选择选项 1,例如 this。如果它真的 只是 2000 个条目,你会没事的。它不会比这更快,您的数据将永远是新鲜的。但是,您将有一个明显的“设置时间”,如果 2000 个条目很快会变成 10000 个,您可能会遇到麻烦。确保您与解决方案沟通您的疑虑,并就如何改进它提出建议。理性的人倾向于听那些。
  • 感谢您的帮助,我可能有时间通过​​与服务器同步来完成 db 部分,这可能需要我一些额外的时间,但我已经有了可以处理任何类型数据的抽象 db ,事务,预编译等,只需要大约 4-5 小时的修改。我接受了你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多