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#query が呼び出されていることがわかります。現在のスレッドで API 呼び出しを実行しようとすると、networkonmainthreadException が発生します。
データが変更されたことをカーソルに通知しようとしましたが、成功しませんでした。
getContext().getContentResolver().notifyChange(Uri.parse("content://com.foo.test"), null);
...
cursor.setNotificationUri(getContext().getContentResolver(), Uri.parse("content://com.foo.test"));
OSに別のスレッドでコンテンツプロバイダーを強制的に呼び出すか、少なくともカーソルに新しいコンテンツがあることを検索に通知させることができますか?
ありがとうございました