android:“渐进式”自定义搜索提供程序

时间:2013-02-25 19:08:41

标签: android android-contentprovider android-searchmanager

我有一个自定义搜索内容提供商,它结合了最近的搜索和进行网络REST呼叫的特定结果。

问题是,如果网络挂起或缓慢,则不会返回结果。我想知道是否有办法逐步返回结果......在我的情况下,立即返回先前的搜索,并在网络搜索结果可用时返回。

我没有看到这是怎么可能的,因为这似乎是拉模型。 UI组件正在请求搜索结果,并且无法知道何时重新请求获取基于网络的结果...即使我能理解为挂钩它以使其重新请求结果。

任何想法? 感谢。

1 个答案:

答案 0 :(得分:1)

回答我自己的问题......

这就是我处理这个问题的方法。内容提供者本身从不访问主请求线程中的网络。相反,它,

  1. 查找查询的缓存结果
  2. 如果有缓存结果,请立即返回
  3. 如果没有缓存结果,则启动工作线程以查找结果,并返回空结果
  4. 当#3的工作线程完成时,它会广播一个意图。这是由托管搜索的活动收到的,触发它重新提交相同的搜索。这次当搜索查询到达内容提供者时,结果被缓存,并立即返回。

    唯一的复杂性是如何在没有用户交互的情况下强制活动重新提交搜索。解决方案因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);
            }
        }