Мы пытаемся подключить наше приложение AndroidTV, чтобы добавлять результаты в глобальный поиск. Я столкнулся с проблемой, когда я не могу сделать вызов 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 в текущем потоке, я получу исключение networkonmainthread.
Я попытался уведомить курсор, через который были изменены данные, но безуспешно.
getContext().getContentResolver().notifyChange(Uri.parse("content://com.foo.test"), null);
...
cursor.setNotificationUri(getContext().getContentResolver(), Uri.parse("content://com.foo.test"));
Могу ли я в любом случае заставить ОС вызывать поставщика контента в отдельном потоке или, по крайней мере, уведомлять поиск о том, что курсор имеет новый контент?
Спасибо