Sporadic IllegalArgumentException:未知的URL内容://

Dav*_*Liu 5 android android-contentresolver android-contentprovider

很少得到:

Fatal Exception: java.lang.IllegalArgumentException: Unknown URL content://com.example.provider/info  
    at android.content.ContentResolver.insert(ContentResolver.java:1252)

Fatal Exception: java.lang.IllegalArgumentException: Unknown authority com.example.provider
    at android.content.ContentResolver.applyBatch(ContentResolver.java:1247)
Run Code Online (Sandbox Code Playgroud)

很少强调.一般工作正常没有问题,所以当局设置得很好,但这种情况每隔一段时间就会出现无缘无故.是否有原因导致ContentResolver无法找到ContentProvider(即如果尚未设置)?

rig*_*roo 5

IllegalArgumentException当我ContentResolver在自定义Application对象中执行操作时,遇到了罕见的Unknown URIs问题。

例如,我试图通过应用程序onCreate方法删除内容提供程序中的项目,这有时会崩溃:

public class CustomApplication extends Application {

    @Override
    public void onCreate() {
        //..
        context.getContentResolver().delete(ReminderEntry.getContentURI(), null, null, null, null);
        //.. 
    }
}
Run Code Online (Sandbox Code Playgroud)

有时会导致以下崩溃:

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)
Run Code Online (Sandbox Code Playgroud)

我也看到了与BOOT_COMPLETE接收器类似的行为。我报告了约70万个月度活跃用户的此类异常崩溃(大多数为Infinix设备,约占43%,几乎没有三星设备)。IllegalArguementException设备状态

我将其移至后台排定的工作中,此后再也没有看到崩溃。我曾经只能在使用过的Nexus设备上重现此问题,但是再也没有。

我怀疑有时在某些设备上的某些版本的Android上Application/ BOOT_COMPLETEReceiver会在ContentProvider完全初始化之前初始化,因此,当它尝试访问它时,尚未正确设置。

有一对夫妇计算器职位,到底该怎么做,创建第一状态和操作系统如何的应该表现:

是否确保在调用定义的启动接收器之前实例化Application类

但是就像我说的那样,我已经看到了另外的情况,并且将操作从类中移出到后台调度程序中似乎可以解决问题(也许只是因为设置花费了更长的时间)。希望我的经验能对您有所帮助。

编辑:我使用了Evernote作业调度程序,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;
    }
}
Run Code Online (Sandbox Code Playgroud)