मेरे पास अज्ञात यूआरआई मुद्दे के साथ दुर्लभ IllegalArgumentException
था जब मैं कस्टम Application
ऑब्जेक्ट में ContentResolver
संचालन कर रहा था।
उदाहरण के लिए, मैं आवेदन 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
रिसीवर के साथ समान व्यवहार भी देखा। मेरे पास लगभग 200 000 मासिक सक्रिय उपयोगकर्ताओं के इस अपवाद (ज्यादातर इन्फिनिक्स डिवाइस ~ 43%, शायद ही कोई सैमसंग डिवाइस) के साथ लगभग 70 रिपोर्ट दुर्घटनाएं हुईं।
मैंने इसे पृष्ठभूमि निर्धारित नौकरी में स्थानांतरित कर दिया और तब से दुर्घटना नहीं देखी है। मैं कभी भी एक नेक्सस डिवाइस पर एक बार इस मुद्दे को पुन: उत्पन्न करने में सक्षम था जिसे मैंने उपयोग किया लेकिन कभी नहीं।
मैं शायद संदेह कभी कभी कुछ उपकरणोंApplication
/BOOT_COMPLETE
रिसीवर ContentProvider
से पहले initializes पर Android के कुछ संस्करणों पर पूरी तरह से आरंभ और इसलिए जब यह तक पहुँचने के लिए कोशिश करता है, यह ठीक से अभी तक सेट नहीं किया गया है।
stackoverflow पदों है कि राज्य कर के एक जोड़े वास्तव में क्या पहले बनाई गई है कर रहे हैं और कैसे ओएस चाहिए व्यवहार:
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;
}
}
क्या आपने manifestSxml और android में उसी प्राधिकरण के साथ अपना ContentProvider परिभाषित किया है: exported = "true"? –
हाँ, सामग्री प्रदाता प्राधिकरण एंड्रॉइडमैन और उपयोग दोनों में समान है, जो परीक्षण के तहत सही ढंग से हल करने वाली सामग्री यूरी द्वारा सिद्ध किया जाता है। सामग्री प्रदाता केवल एक आंतरिक उपयोग है, इसलिए हमारे निर्यात को गलत पर सेट किया गया है। –
आप अपने ContentProvider को कैसे परिभाषित करते हैं? – rds