ContentProvider insert () siempre se ejecuta en el hilo de la IU?

Tengo una aplicación que necesita extraer datos de un servidor e insertarlos en una base de datos SQLite en respuesta a la entrada del usuario. Pensé que esto sería bastante simple: el código que extrae los datos del servidor es una subclase bastante sencilla de AsyncTask, y funciona exactamente como lo espero sin colgar el subproceso de la interfaz de usuario. Implementé la funcionalidad de devolución de llamada con una interfaz simple y la envolví en una clase estática, por lo que mi código se ve así:

MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() {
    @Override
    public void onFolderContentsResponse(final List<FilesystemEntry> contents) {
        // do something with contents
    }
}

Todo sigue siendo bueno. Incluso si el servidor tarda una hora en recuperar los datos, la IU se ejecuta sin problemas, porque el código en getFolderContents se ejecuta en el método doInBackground de una AsyncTask (que está en un subproceso separado de la interfaz de usuario). Al final del método getFolderContents, se llama a onFolderContentsResponse y se pasa la lista de FilesystemEntry que se recibió del servidor. Solo digo todo esto para que quede claro que mi problema no está en el método getFolderContents o en ninguno de mis códigos de red, porque nunca ocurre allí.

El problema surge cuando intento insertarlo en una base de datos a través de mi subclase de ContentProvider dentro del método onFolderContentsResponse; la interfaz de usuario siempre se cuelga mientras se ejecuta ese código, lo que me lleva a creer que, a pesar de ser llamado desde el método doInBackground de una AsyncTask, las inserciones todavía se están ejecutando en el subproceso de la interfaz de usuario. Así es como se ve el código problemático:

MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() {
    @Override
    public void onFolderContentsResponse(final List<FilesystemEntry> contents) {
        insertContentsIntoDB(contents);
    }
}

Y elinsertContentsIntoDB método:

void insertContentsIntoDB(final List<FilesystemEntry> contents) {
    for (FilesystemEntry entry : contents) {
        ContentValues values = new ContentValues();
        values.put(COLUMN_1, entry.attr1);
        values.put(COLUMN_2, entry.attr2);
        // etc.

        mContentResolver.insert(MyContentProvider.CONTENT_URI, values);
    }
}

donde mContentResolver se ha establecido previamente como resultado del método getContentResolver ().

He intentado poner insertContentsIntoDB en su propio Thread, así:

MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() {
    @Override
    public void onFolderContentsResponse(final List<FilesystemEntry> contents) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                insertContentsIntoDB(contents);
            }
        }).run();
    }
}

También he intentado ejecutar cada inserción individual en su propio hilo (el método de inserción en MyContentProvider está sincronizado, por lo que esto no debería causar ningún problema allí):

void insertContentsIntoDB(final List<FilesystemEntry> contents) {
    for (FilesystemEntry entry : contents) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                ContentValues values = new ContentValues();
                values.put(COLUMN_1, entry.attr1);
                values.put(COLUMN_2, entry.attr2);
                // etc.
                mContentResolver.insert(MyContentProvider.CONTENT_URI, values);
            }
        }).run();
    }
}

Y solo por si acaso, también probé ambas soluciones con el código relevante en el método doInBackground de otra AsyncTask. Finalmente, definí explícitamente MyContentProvider como viviendo en un proceso separado en mi AndroidManifest.xml:

<provider android:name=".MyContentProvider" android:process=":remote"/>

Funciona bien, peroTodavía parece funcionar en el hilo de la interfaz de usuario. Ese es el punto en el que realmente comencé a arrancarme el pelo con esto, porque eso no tiene ningún sentido para mí. No importa lo que haga, la interfaz de usuario siempre se bloquea durante las inserciones. ¿Hay alguna manera de conseguir que no lo hagan?

Respuestas a la pregunta(4)

Su respuesta a la pregunta