これが私がこの問題を処理する方法でした。コンテンツ プロバイダー自体がメインの要求スレッドでネットワークにアクセスすることはありません。代わりに、
- クエリに対してキャッシュされた結果を探します
- キャッシュされた結果がある場合は、すぐにそれを返します
- キャッシュされた結果がない場合は、ワーカー スレッドを開始して結果を検索し、空の結果を返します。
#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);
}
}