首页 > 解决方案 > 拥有 ContentProvider 的进程中的异常崩溃使用 ContentProvider 的进程

问题描述

我有两个应用程序。我们称它们为 DataSource 和 QueryApp。

DataSource 应用程序导出 ContentProvider。

<provider
    android:name="com.example.ContentProvider"
    android:authorities="${applicationId}"
    android:exported="true"
    android:readPermission="${applicationId}.read" />

QueryApp 使用来自 DataSource 的 ContentProvider:

context.contentResolver.acquireContentProviderClient(uri)?.use { contentProviderClient ->
    contentProviderClient.query(uri, null, null, null, null)?.use { cursor ->
        ... do something with the cursor ...
    }
}

问题是如果DataSource进程在执行请求的初始化过程中崩溃了,QueryApp进程也会崩溃。而且我无法捕捉到异常。

在 QueryApp 进程内部,调用 时acquireContentProviderClient(uri),会收到远程异常:

E/JavaBinder: *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
java.lang.ExceptionInInitializerError

...

E/AndroidRuntime: FATAL EXCEPTION: Binder:6230_3
Process: com.example.datasource, PID: 6230
    java.lang.ExceptionInInitializerError

该异常归因于 DataSource 进程。QueryApp 进程也不例外。然后两个进程都崩溃了。

我试过捕捉错误,但它不起作用:

try {
    context.contentResolver.acquireContentProviderClient(uri)?.use { contentProviderClient ->
        contentProviderClient.query(uri, null, null, null, null)?.use { cursor ->
            ... do something with the cursor ...
        }
    }
} catch (e: Error) {
    /* we won't reach this line */
}

我试过设置 UncaughtExceptionHandler 但它也不起作用:

// This is the Thread that we are going to make query on
Thread(it, "SafeContentProviderThread").apply {
    setUncaughtExceptionHandler { t, e ->
        Log.e("Uncaught exception caught and swallowed")
    }
}

我可以捕获错误并防止 QueryApp 进程崩溃吗?

标签: androidandroid-contentprovider

解决方案


推荐阅读