【问题标题】:android: "progressive" custom search providerandroid:“渐进式”自定义搜索提供程序
【发布时间】:2013-02-25 19:08:40
【问题描述】:
我有一个自定义搜索内容提供程序,它结合了最近的搜索和网络 REST 调用的特定结果。
问题是,如果网络挂起或速度很慢,则不会返回任何结果。我想知道是否有办法逐步返回结果......在我的情况下,立即返回以前的搜索,并在可用时返回网络搜索结果。
我不知道这怎么可能,因为这似乎是一个拉模型。 UI 组件正在请求搜索结果,并且无法知道何时重新请求以获取基于网络的结果......即使我可以理解挂钩以使其重新请求结果。
有什么想法吗?
【问题讨论】:
标签:
android
android-contentprovider
android-searchmanager
【解决方案1】:
这就是我处理这个问题的方法。内容提供者本身从不访问主请求线程中的网络。相反,它,
- 查找查询的缓存结果
- 如果有缓存结果,立即返回
- 如果没有缓存结果,则启动工作线程查找结果,返回空结果
当#3 的工作线程完成时,它会广播一个意图。这由托管搜索的活动接收,触发它重新提交相同的搜索。这次当搜索查询到达内容提供者时,结果被缓存,并立即返回。
唯一的复杂性是如何强制 Activity 在没有用户交互的情况下重新提交搜索。解决方案因android版本而异,
public void onReceive(Context context, Intent intent) {
String query = intent.getStringExtra(SearchManager.QUERY);
if (query == null) {
return;
}
// if user has typed something new, ignore
if (!query.equals(searchQuery)) {
return;
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) {
SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setQuery(query, false);
} else {
SearchManager sm = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
ComponentName cm = FolderActivity.this.getComponentName();
sm.startSearch(query, false, cm, null, false);
}
}