Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call API in content provider for global search

We are attempting to hook up our AndroidTV app to append results into the global search. I'm running into an issue where I cannot make an api call to get the results because the system calls my content provider on the main thread.

@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"/>

When i do a global search i can see that the ContentProvider#query is called. If i attempt to do an api call on the current thread i get an networkonmainthreadexception.

I have attempted to notifty the cursor that data has changed via but had no success either.

getContext().getContentResolver().notifyChange(Uri.parse("content://com.foo.test"), null);
...
cursor.setNotificationUri(getContext().getContentResolver(), Uri.parse("content://com.foo.test"));

Is there anyway i can force the O.S to call the content provider on a seperate thread or at least notify the search that the cursor has new content?

Thank You

like image 880
Darussian Avatar asked Oct 01 '14 02:10

Darussian


1 Answers

One of the solutions can be to set the content provider process

android:process:":androidtv"

and set the ThreadPolicy to LAX just before making network call

ThreadPolicy tp = ThreadPolicy.LAX;
StrictMode.setThreadPolicy(tp);

By running contentprovider in a different process, even if the query runs on main thread, it will not affect your UI operations

like image 176
nandeesh Avatar answered Oct 07 '22 00:10

nandeesh