我有一个SearchView
设置,我有一个使用Retrofit
和Otto
的松散解耦架构。
我想知道什么最佳实践是在Android搜索,或一般的任何移动应用程序(意思是这样的东西也可以应用于iOS)。
具体来说,我使用AutoCompleteTextView
来处理我的SearchView
中的建议,数据直接来自API
。我不认为这是最佳实践,因为每次用户更改SearchView
中的文本时,都会启动API调用。
我正在考虑在SQLite中存储缓存,然后从那里ping结果,但是如果用户想要最直接的数据呢?你会怎么处理?那会采用什么模式呢?
对于Android中搜索的最佳架构或方法,我将非常感谢。
我认为在用户停止输入之前进行API调用是没有意义的。因此,您可以设置延迟,比如500ms。当用户停止输入时,在500ms后,您可以调用API并显示结果。
您可以使用Handler
的postDelayed
方法来调度搜索API调用。您可以使用Handler来控制消息队列。每次用户键入一个字符并取消之前的消息时,都会发布一个延迟的Runnable
。它看起来是这样的:
public void onTextChanged(CharSequence s, int start, int before, int count) {
handler.removeCallbacks(searchRunnable);
handler.postDelayed(searchRunnable, 500);
}
- 首先,你必须使列作为索引,这是搜索属性。
- 你必须只存储该列在sqlite数据库。它用于在用户进行搜索时从表中选择选项。
- 然后在搜索栏中选择单词后调用api获取搜索结果。
因此,为了充分地回答这个问题,因为我对这里的其他答案不满意,在这个问题中还有几个步骤需要考虑。
首先,我们需要问一些关于如何处理这个问题的问题:
- 有自动补全吗?
- 搜索的范围是什么?
- 有缓存吗?
还有很多问题。
我可能会首先构建一个自定义适配器来处理搜索中的查询,然后在用户的查询上实现主动缓存。这一点很重要,因为用户的查询非常重要。这可能是有意义的,只使用Autocomplete
缓存的结果,它是非常昂贵的实现自动完成,并让它ping服务器在每次文本更改。
缓存可以通过在Android中使用SQLite
助手来完成。这可能是昂贵的,但我们正在处理简单的查询对象,(因为这应该是API的情况,对象应该是内存或字节大小昂贵的)。