Мы пытаемся подключить наше приложение AndroidTV, чтобы добавить результаты в глобальный поиск. Я столкнулся с проблемой, когда я не могу сделать api-вызов для получения результатов, потому что система вызывает мой контент-провайдер в основном потоке.Call API в поставщике контента для глобального поиска
@Override
public Cursor query(Uri uri, String[] projection, String search, String[] selectionArgs, String searchOrder) {
... Logic here that calls the API using RxJava/Retrofit
return cursor;
}
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/foo"
android:searchSettingsDescription="@string/foo_results"
android:includeInGlobalSearch="true"
android:searchSuggestAuthority="com.foo.search.provider"
android:searchSuggestIntentAction="android.intent.action.VIEW" />
<provider
android:authorities="com.foo.search.provider"
android:name=".search.GlobalSearchProvider"
android:exported="true"/>
Когда я выполняю глобальный поиск, я вижу, что вызывается запрос ContentProvider #. Если я пытаюсь выполнить вызов api в текущем потоке, я получаю сетевое имя.
Я попытался изменить курсор, который изменил данные, но также не имел успеха.
getContext().getContentResolver().notifyChange(Uri.parse("content://com.foo.test"), null);
...
cursor.setNotificationUri(getContext().getContentResolver(), Uri.parse("content://com.foo.test"));
Есть в любом случае я могу заставить O.S назвать контент-провайдера на отдельном потоке или, по крайней мере, уведомить поиска, что курсор имеет новое содержание?
Спасибо
Не могли бы вы, пожалуйста, посмотрите на мой ответ ниже? – Sebastiano
@dextor Я думаю, вы можете попытаться изменить порядок, в котором ваш searchableinfo появляется в списке SearchManager.getSearchablesInGlobalSearch(). Я думаю, вы можете сделать это, изменив имя операции поиска. Так что ваш поиск приложения будет выполнен последним приложением для поиска, но я не уверен, что он сработает. Кроме того, точка создания отдельного процесса заключается в том, что запрос не запускается в основном потоке, если вы просто установите политику lax, запрос будет выполняться в основном потоке, а операции пользовательского интерфейса могут быть отложены или вы можете получить ANR – nandeesh
Мои результаты поиска уже отображаются в качестве последнего результата, так что это не выход. Я знаю, что работа над отдельным процессом «решает» проблему, но я заметил, что возникающее отставание намного выше, чем при одном и том же процессе. И я не могу понять, почему. – Sebastiano