Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 处理搜索的最佳实践_Android_Search_Searchview_Otto - Fatal编程技术网

Android 处理搜索的最佳实践

Android 处理搜索的最佳实践,android,search,searchview,otto,Android,Search,Searchview,Otto,我有一个SearchView设置,我有一个松散解耦的体系结构,使用reformation和Otto 我想知道在Android或任何移动应用程序中搜索的最佳实践是什么(这意味着类似的东西也可以应用于iOS) 具体地说,我正在使用一个AutoCompleteTextView来处理我的SearchView中的建议,数据直接来自API。我不认为这是一种最佳实践,因为每次用户在SearchView中更改文本时,都会启动一个API调用 我正在考虑在SQLite中存储一个缓存,然后从那里ping结果,但是如果

我有一个
SearchView
设置,我有一个松散解耦的体系结构,使用
reformation
Otto

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

具体地说,我正在使用一个
AutoCompleteTextView
来处理我的
SearchView
中的建议,数据直接来自
API
。我不认为这是一种最佳实践,因为每次用户在
SearchView
中更改文本时,都会启动一个API调用

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


如果您能想到Android的最佳架构或搜索方法,我将不胜感激。

我认为在用户停止键入之前调用API是没有意义的。所以,你可以延迟,比如说,500毫秒。当用户停止键入时,500毫秒后您将进行API调用并显示结果

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

public void onTextChanged(CharSequence s, int start, int before, int count) {
    handler.removeCallbacks(searchRunnable);
    handler.postDelayed(searchRunnable, 500);
}
  • 首先,必须将列作为索引,这是搜索属性
  • 您只需在sqlite数据库中存储该列。当用户进行搜索时,该列用于从表中选择选项
  • 然后,在搜索栏中选择的单词之后,调用api以获得搜索结果

  • 因此,用一个充分的方式回答这个问题,因为我不满意这里的其他答案,在这个问题中还有几个步骤要考虑。 首先,我们需要就如何解决这一问题提出几个问题:

    • 有自动完成吗
    • 搜索范围是什么
    • 会有缓存吗
    还有很多问题

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


    在Android中使用
    SQLite
    助手可以实现缓存。这可能会很昂贵,但我们处理的是简单的查询对象(因为API中的对象应该是内存或字节大小昂贵的)。

    是的,我忘记在我的原始问题中添加了这一点,我还打算放置一个处理程序,以便在用户停止键入之前不会进行API调用。不过,对于自动完成和建议,我有一个最重要的问题,处理这个问题的最佳实践是什么?SQLite?您的数据源是什么?它是RESTAPI吗?当您从服务器获取数据时,您将其存储在缓存中,然后当用户从查询中删除字符时,您可以通过过滤来重用它。我认为您不应该将搜索结果缓存在数据库中,因为这样您的搜索结果就不会总是最新的。您可以将其用于脱机搜索,但我不会在联机中使用搜索缓存。它是一个REST API,所以您的建议是不要将SQLite DB用于自动完成?我是否应该将自动完成建议存储在SQLite数据库中,然后按时间间隔ping服务器以获取最新信息?你觉得这个策略怎么样?你需要支持离线搜索吗?如果是,那么您肯定需要SQLite DB。如果否,则取决于您希望看到的功能。例如,如果您有缓存,您可以在用户键入字符时显示它,同时进行API调用。收到响应后,使用最新数据更新列表并更新数据库。我不喜欢这个解决方案,因为我不喜欢在看到数据时更新数据。我宁愿等待网络响应并先显示相关数据,然后再将其存储到DB以供脱机使用。此外,如果显示数据库中的数据,服务器上的某些项目可能会被删除,并且您将显示不再存在的结果。如果使用数据库缓存,请确保能够处理这种情况。