當我在自定義Application
對象中執行ContentResolver
操作時,我有罕見的IllegalArgumentException
與未知的URI問題。
例如,我試圖刪除應用程序onCreate
方法在我的內容提供商項目這將很偶然崩潰:
public class CustomApplication extends Application {
@Override
public void onCreate() {
//..
context.getContentResolver().delete(ReminderEntry.getContentURI(), null, null, null, null);
//..
}
}
這有時會呈現以下崩潰:
Fatal Exception: java.lang.RuntimeException: Unable to create application com.myapp.CustomApplication: java.lang.IllegalArgumentException: Unknown URL content://com.myapp.db.CustomContentProvider/reminder
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6431)
at android.app.ActivityThread.access$1800(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7331)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by java.lang.IllegalArgumentException: Unknown URL content://com.myapp.db.CustomContentProvider/reminder
at android.content.ContentResolver.delete(ContentResolver.java:1376)
at com.myapp.ReminderEntryDao.delete(Unknown Source)
at com.myapp.CustomApplication.onCreate(Unknown Source)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1037)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6428)
at android.app.ActivityThread.access$1800(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7331)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
我也看到了與BOOT_COMPLETE
接收器類似的行爲。我有大約70個報告的崩潰,這個例外(大多數Infinix設備〜43%,幾乎沒有三星設備)每月約20萬活躍用戶。
我把它移到了後臺計劃的工作中,並沒有看到崩潰。我曾經只能在我使用過的Nexus設備上重現過這個問題,但從未再一次。
我猜想也許有時在某些設備上的Application
/BOOT_COMPLETE
接收機的ContentProvider
前初始化的Android的一些版本完全初始化的,因此當它試圖訪問它,它沒有正確設置呢。
有一對夫婦計算器職位,做國家的到底是什麼創造了第一,如何OS 應該的行爲:
Is the Application class guaranteed to be instantiated before a defined boot receiver is called
但是就像我說的,我已經看到了,否則和移動操作將類從後臺調度程序中解放出來似乎可以解決問題(也許這只是因爲它需要更長的時間才能完成設置)。希望我的經驗能幫助你。
編輯:我使用了evernote job dispatcher,並根據需要推遲了我的ContentResolver
操作。 (但我會假設推遲內容提供商操作到任何類型的後臺處理可能會修復它,因爲它有更多的時間來設置 - 這些只是我的懷疑當然)。
class DeleteRemindersJob extends Job {
@NonNull
@Override
protected Result onRunJob(final Params params) {
cursor = getContext().getContentResolver().delete(ReminderEntry.getContentURI(), null, null, null, null);
//..
return Result.SUCCESS;
}
}
你是否已在manifest.xml和android:exported =「true」中定義了具有相同權限的ContentProvider? –
是的,內容提供者權限在androidmanifest和用法中都是相同的,內容uri在測試中正確解析。內容提供商僅限內部使用,因此我們的導出設置爲false。 –
你如何定義你的ContentProvider? – rds