2012-02-27 14 views
27

मैं एंड्रॉयड बाजार से क्रैश रिपोर्ट हो रही है:संसाधन NotFoundException?

android.content.res.Resources$NotFoundException: Resource ID #0x.... 

मैं इनमें से लगभग 17 एक सप्ताह मिलता है। यह मुझे मेरे कोड में निम्नलिखित के लिए इंगित कर रहा है:

context.getResources().getDrawable(R.drawable.foo); 

वह संसाधन निश्चित रूप से मेरे/खींचने योग्य फ़ोल्डर में मौजूद है। मेरे पास कई सौ हजार इंस्टॉल हैं, मुझे यकीन नहीं है कि यह कुछ उपयोगकर्ताओं के लिए असफल कैसे हो सकता है, लेकिन विशाल बहुमत के लिए काम कर रहा है। मैं यह जानना चाहता हूं कि क्या हो रहा है, क्योंकि वे इस स्थिति में ऐप का उपयोग नहीं कर सकते हैं। कोई विचार?

धन्यवाद

--------- अद्यतन ----------------------

इसके अलावा मैं देख सकता हूँ मेरी R.java फ़ाइल में सवाल में drawable के लिए प्रवेश, लगता है:

public static final int foo=0x7f020034; 

मैं इस परियोजना के लिए एक साफ निर्माण करते हैं, तो सीधे के बाद कि मेरी रिहाई का निर्माण करना (कोई कोड संशोधन के बीच में स्वत: देने के लिए ग्रहण निर्माण सामग्री संभवतः आर फ़ाइल को जाने दें)

धन्यवाद

+0

यह स्पष्ट हो सकता है, लेकिन क्या आपके पास चयनित "ग्रहण स्वचालित रूप से" चेक है? यदि आप ग्रहण का उपयोग नहीं करते हैं, तो क्या आपने उन्हें संशोधित करने के बाद संसाधन कक्षाओं को पुन: उत्पन्न किया? क्या आप हमें अपनी आर कक्षा दिखा सकते हैं? – m0skit0

+0

हाय हाँ मेरे पास "स्वचालित रूप से निर्माण" किया गया है, लेकिन मैं प्रत्येक रिलीज से पहले एक साफ निर्माण करना सुनिश्चित करता हूं। मैं आरजेवा (ऊपर चिपकाया गया) में उस ड्रॉ करने योग्य के लिए संसाधन प्रविष्टि देख सकता हूं। धन्यवाद – user291701

+0

मुझे चिपका हुआ कुछ भी नहीं दिख रहा है, लेकिन अगर आप कहते हैं कि प्रविष्टि है ... क्या आर सही में दिखाया गया पैकेज है (जैसा कि आपकी गतिविधि)? – m0skit0

उत्तर

10

क्या क्रैश रिपोर्ट संस्करण < = 1.6 से आ रही है, और आपके पास केवल "drawable" की बजाय योग्य फ़ोल्डरों में कुछ संसाधन हैं, यानी "drawable-mdpi"? यदि ऐसा है तो this page के नीचे "ज्ञात समस्याएं" के बारे में पढ़ें।

+0

आह डांग मेरे पास कुछ संसाधन/ड्रॉबल-एमडीपीआई और दूसरों में बस/आकर्षित करने योग्य हैं। मैं इसे कुछ समय के लिए 1.6 एमुलेटर पर चला रहा हूं, और इसके साथ कभी भी कोई समस्या नहीं थी (मेरा न्यूनतम लक्ष्य 1.6 है, इसलिए उपयोगकर्ताओं को भी 1.5 पर चलाने में सक्षम नहीं होना चाहिए)। क्या यह हो सकता है? क्या यह भी एमुलेटर पर दुर्घटनाग्रस्त नहीं होना चाहिए? – user291701

+0

हां, यह एमुलेटर पर भी क्रैश होना चाहिए। मैं इस प्रकार की बग को ट्रैक करने के लिए 1.6-एमुलेटर का उपयोग कर रहा हूं। यदि आपने एमुलेटर के साथ सावधानी से परीक्षण किया है, तो आप इस बग को बाहर कर सकते हैं:/ – pgsandstrom

+0

हम्म हां वास्तव में अब मैं देखता हूं कि बाजार कह रहा है कि यह त्रुटि नेक्सस वन, Droid, फिर अन्य पर हो रही है। मुझे लगता है कि नेक्सस वन न्यूनतम 2.0 चला रहा था, जो Droid के लिए समान था। अरे। – user291701

2

आज सुबह मेरे आवेदन पर एक ही समस्या मिली और मुझे इसका एक बहुत ही सरल समाधान मिला। समस्या बड़ी और जटिल लगती है लेकिन यह नहीं है।

कदम जो मैं पीछा किया

  1. अपने डिवाइस
  2. भागो आवेदन से बिन फ़ोल्डर यह आत्म
  3. स्वच्छ परियोजना
  4. निकालें एप्लिकेशन हटाएं और अपने परिदृश्य जाँच कर रहे हैं।

मेरे अनुसार यह इस अपवाद को दोबारा नहीं देना चाहिए।

कारण: जब आप एप्लिकेशन बनाते हैं R.java में सभी मेमोरी पता होते हैं और ऐसा होता है कि वे पते अगले रन के लिए अमान्य हैं।

दूसरा कारण: जब आपके पास एप्लिकेशन है जो लांसस्केप और पोर्ट्रेट मोड दोनों का समर्थन करता है और यदि आपने उनमें से किसी के लिए XML फ़ाइल नहीं लिखी है तो यह संभावना है कि इस तरह की दुर्घटना हो सकती है। और जब आप दोनों मोड का समर्थन करना चाहते हैं तो आउटोफमेमरी और मेमोरी रिसाव के मुद्दों की काफी संभावनाएं हैं। कृपया इस पर भी विचार करें।

+0

वैसे भी मेरे लिए - यह उपयोगी नहीं है। मुझे ऐप स्टोर पर लाइव प्रोजेक्ट्स से इन क्रैश रिपोर्ट मिल रही हैं। मैंने परीक्षण के दौरान या विभिन्न उपकरणों का उपयोग करके लाइव संस्करण के अपने उपयोग के दौरान इसे कभी नहीं देखा है (जो एक ही डिवाइस/ओएस हैं क्योंकि कुछ रिपोर्टें भेजी जा रही हैं)। यह मेरे लिए एक विशिष्ट संसाधन/पता से संबंधित प्रतीत नहीं होता है - क्योंकि मैंने सभी प्रकार के संसाधनों को प्राप्त करते समय क्रैश रिपोर्ट देखी है - क्या यह ओएस द्वारा OutOfMemory अपवादों को फेंकने के कारण हो सकता है? यदि ऐसा है तो मुझे ओओएम क्रैश/स्टैक निशान नहीं मिल रहा है। –

+0

मैंने अपना उत्तर संपादित किया है। कृपया एक नज़र डालें –

+1

तो क्या आप यह कह रहे हैं - ऐसा इसलिए हो सकता है क्योंकि मैं मुख्य रूप से एक लेआउट लोड कर रहा हूं .... इस लेआउट को मानक लेआउट फ़ोल्डर में शामिल नहीं किया गया है, इसके बजाय इसे लेआउट-सामान्य-पोर्ट के भीतर शामिल किया गया है , लेआउट-बड़े-पोर्ट और लेआउट-एक्सलार्ज-पोर्ट और भूमि (मैंने अभिविन्यास सेट किया है, इसलिए इसे इनमें से किसी एक के भीतर फिट होना चाहिए) - ऐसा इसलिए हो सकता है क्योंकि डिवाइस अपनी स्वयं की कॉन्फ़िगरेशन को समझने में असमर्थ हैं और संसाधन को लेने का प्रयास करते हैं लेआउट फ़ोल्डर? 0- दिलचस्प बात यह है कि मैं उन उपकरणों पर कुछ रिपोर्ट देख रहा हूं जिन पर मैंने परीक्षण किया है। –

2

यह कई घनत्व वाले फोन पर कई बार हुआ है। मैंने यह भी देखा कि यह ज्यादातर 9-पैच छवियों के साथ होता है।

मेरा समाधान 9-पैच छवियों को जितना घनत्व संसाधन फ़ोल्डर्स (एमडीपीआई, एलडीपीआई, एचडीपीआई, एक्सडीपीआई) में शामिल करना था।

1

हे, कोई विचार नहीं, मैं वास्तव में एक समान मुद्दे पर काम कर रहा हूं, लेकिन यह हो सकता है। यह उल्लेखनीय है कि डिवाइस संसाधनों और लेआउट को बढ़ा सकता है, लेकिन यह उन्हें कम नहीं कर सकता है। इसलिए यदि आपके पास न्यूनतम मान हैं, तो उन्हें AndroidManifest.xml में सेट करें। पहले लेआउट-एलडीपीआई और लेआउट-छोटे जोड़ने का प्रयास करें।

प्रवेश के लिए एक उपयोगी तकनीक है जो लेआउट लोड कर ली अपने लेआउट एक्सएमएल फ़ाइल के हर रूट कंटेनर को एक android:tag संलग्न करने के लिए है, और onCreate() में setContentView(R.id.layout) सेट करने के बाद सिर्फ टैग के मान को मुद्रित करें। यह आपको बताएगा कि कौन सा लोड हो गया है - अगर आपको डीबग उद्देश्यों के लिए सभी संभव संयोजन जोड़कर छेद को प्लग करना होगा।

भी, आपके ड्रॉबल्स को drawables-nodpi फ़ोल्डर में बदलने के लिए यह सुनिश्चित करने के लिए कि कोई ड्रॉबल्स गुम नहीं है। यह आंतरिक स्केलिंग बंद कर देता है, एपीके को छोटा बनाता है और किसी अन्य ड्रॉइंग फ़ोल्डर से "पिक" नहीं करता है।

एक बार जब आप यह पता लगाते हैं कि यह लेआउट या ड्रायबल है, तो अतिरिक्त मीट्रिक आपको मूल कारण ढूंढने में मदद करेंगे। अभी के लिए, "हमेशा उपयोग" drawables के साथ पहले लेआउट की जांच करें।

सोमवार मैं वापस कार्यालय के लिए मिलता है मैं तुम्हें इस सूत्र में कब्जा डेटा मापने के लिए इस्तेमाल मैट्रिक्स कोड पोस्ट करेंगे पर - Which part of Android is in charge of picking a correct resource profile?

1

आप कुछ कोड है कि एंड्रॉयड एसडीके से सामग्री संदर्भ शामिल किया है।

उदाहरण के लिए, मैं एक बार ने वही समस्या का सामना करना पड़ा और जब मैं अपने एक्सएमएल से लाइन

android:background="?android:attr/actionBarItemBackground" 

हटा दिया, सब कुछ फिर से ठीक काम करता है।

0

यह तब भी हो सकता है जब आप जिस संसाधन का जिक्र कर रहे हैं (इसे इसे आरएसए कहते हैं) बदले में एक संसाधन का जिक्र कर रहा है जो इसे याद कर रहा है (इसे आरएसबी कहते हैं)। एंड्रॉइड ResA के लिए ResourceNotFoundException को बढ़ाएगा, भले ही वास्तव में क्या याद आ रहा है ResB। ऐसे जीवन है!

मेरे मामले में, Resb को मानों में परिभाषित किया गया था-swxxxdp लेकिन मानों में नहीं। इसलिए मुझे फोन पर यह अपवाद मिल रहा था लेकिन टैबलेट पर नहीं।

Resources$NotFoundException: String resource ID 

जब मैं एक पूर्णांक मान के साथ setText उपयोग कर रहा था:

36

मैं इस अपवाद मिला है। मुझे इसे स्ट्रिंग में बदलना पड़ा।

से पहले:

myTextView.setText(obj.SomeIntProperty);  

के बाद:

मैं निम्नलिखित log-

मिला:

myTextView.setText(String.valueOf(obj.SomeIntProperty)); 
+0

"" + int चाल भी करेगा – stefan

0

मेरे मामले में मुझे लगता है कि दुर्घटना के लिए नेतृत्व एक लेआउट फ़ाइल था enter image description here

,210

यह मेरा वास्तविक कोड के लिए इस लिंक से पता चला है:

enter image description here

कौन सा कोड की इस पंक्ति है:

enter image description here

मैं अपनी फ़ाइल नाविक फ़ोल्डर नाम की जाँच की सबसे लोकप्रिय जवाब द्वारा सुझाए गए के रूप में और यह माना जाता है कि संसाधन की तरह सामान्य layout फ़ोल्डर

enter image description here

लेकिन जब Android फ़ाइल नाविक मैं देखना है कि केवल सामान्य layout फ़ोल्डर में माना जाता है कि लापता संसाधन फ़ाइल नहीं था नहीं कर रहा था बजाय Project फ़ाइल नाविक के तहत देख, लेकिन मैं भी एक layout फ़ोल्डर नहीं था एक विशेष विस्तार के बिना।

enter image description here

res फ़ोल्डर में एक Android संसाधन निर्देशिका जोड़ना और यह layout बुला और फिर अपने विशेषता फ़ोल्डर से संसाधनों पर चिपकाने (उदा। layout-sw720dp) में यह मेरे लिए समस्या का समाधान हो।

enter image description here

यह समाधान के रूप में भी drawable में फाइल नहीं होने और केवल उन्हें drawable-xxhdpi में होने drawable में फ़ाइल ले और यह सुधार करने की जरूरत द्वारा निर्धारित किया जा सकता है के रूप में इस तरह के सुझाव अन्य फ़ोल्डर के लिए काम करेंगे। शुभकामनाएं फ़ोल्डर फाइनेंड्स!

0
  1. प्रोजेक्ट> स्वच्छ ...
  2. अपनी परियोजना का चयन करें, तो "ओके" दबाएं।
  3. ऐप को फिर से लॉन्च करें।
संबंधित मुद्दे