0

最近の検索とネットワーク REST 呼び出しからの特定の結果を組み合わせるカスタム検索コンテンツ プロバイダーがあります。

問題は、ネットワークがハングしたり遅い場合、結果が返されないことです。結果を段階的に返す方法があるかどうか疑問に思っています...私の場合、以前の検索をすぐに返し、利用可能なときにネットワーク検索結果を返します。

これはプル モデルのように見えるため、これがどのように可能になるかはわかりません。UI コンポーネントは検索結果を要求しており、ネットワーク ベースの結果を取得するためにいつ再要求するかを知る方法がありません。結果を再要求するためにそれにフックすることを理解できたとしてもです。

何か案は?

4

1 に答える 1

1

これが私がこの問題を処理する方法でした。コンテンツ プロバイダー自体がメインの要求スレッドでネットワークにアクセスすることはありません。代わりに、

  1. クエリに対してキャッシュされた結果を探します
  2. キャッシュされた結果がある場合は、すぐにそれを返します
  3. キャッシュされた結果がない場合は、ワーカー スレッドを開始して結果を検索し、空の結果を返します。

#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);
        }
    }
于 2013-03-18T18:26:41.697 に答える