2012-10-10 7 views
8

मेरे पास मेरे ऐप के लिए निम्न एप्लिकेशन क्लास है। जब एप्लिकेशन शुरू होता है, तो मैं वरीयताओं से कुछ सेटिंग्स प्राप्त करना चाहता हूं और पृष्ठभूमि सेवा शुरू करना चाहता हूं।आवेदन के बीच रेस की स्थिति क्रेट और संसाधनों को लोड किया गया?

public class MyApplication extends Application { 

    public void onCreate() { 
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
      String key = getResources().getString(R.string.prefkey_updateinterval); 
      ... 
    } 

यह सामान्य रूप से ठीक काम करता है, लेकिन कभी-कभी जब ग्रहण "रन" से मेरा कार्यक्रम शुरू मैं इस त्रुटि मिलती है:

10-10 08:25:47.016: E/AndroidRuntime(26402): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x7f0a0004 
10-10 08:25:47.016: E/AndroidRuntime(26402): at android.content.res.Resources.getText(Resources.java:216) 
10-10 08:25:47.016: E/AndroidRuntime(26402): at android.content.res.Resources.getString(Resources.java:269) 
10-10 08:25:47.016: E/AndroidRuntime(26402): at com.karwosts.MyApp.PortfolioStore.onCreate(PortfolioStore.java:40) 
10-10 08:25:47.016: E/AndroidRuntime(26402): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969) 
10-10 08:25:47.016: E/AndroidRuntime(26402): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3395) 

इस आईडी मेरी R.java से है:

public static final int prefkey_updateinterval=0x7f0a0004; 

चूंकि यह ज्यादातर समय ठीक काम करता है, मुझे यह मानना ​​है कि क्रिएट और संसाधनों के बीच कुछ प्रकार की दौड़ की स्थिति है?

यदि ऐसा है, तो क्या यह अनुशंसा की जाती है कि आवेदन पर संसाधनों को पढ़ना न पड़े?

यदि हां, तो एप्लिकेशन लॉन्च होने पर सेवा शुरू करने के लिए कोई बेहतर जगह है?

+0

आप हमेशा अपने ऐप की मुख्य 'गतिविधि' में' सेवा 'शुरू कर सकते हैं ... इससे' एप्लिकेशन' को उपclass करने की आवश्यकता से बचा जाता है। –

उत्तर

6

Since this works fine most of the time, I have to assume that there is some kind of race condition between onCreate and the resources being loaded?

ही APK फ़ाइल है - कोई recompile, कोई पुनर्स्थापना, आदि - लगातार त्रुटि उत्पन्न नहीं करता है, तो यह रेस स्थिति में किसी प्रकार का, हो सकता है कि हालांकि मुझे आश्चर्य होगा।

तो ही APK फ़ाइल लगातार विफल रहता है, तो यह एक अधिक उपवन के प्रकार संसाधनों-आउट-ऑफ-सिंक-साथ-आराम के-कोड समस्या, और परियोजना की सफाई यह साफ हो जाएगा है अप।

is there a better place to initialize a service when application launches?

IMHO, "एक सेवा प्रारंभ जब आवेदन की शुरूआत" की जरूरत है कि एप्लिकेशन की संख्या बिंदु है जहां मैं कफ जहां यह एक अच्छी योजना होगा बंद एक परिदृश्य के बारे में सोच नहीं कर सकते करने के लिए बहुत कम है। यह कहना नहीं है कि आपके पास ऐसा परिदृश्य नहीं है, लेकिन यह बिना किसी स्पष्टीकरण के मेरी पुस्तक में एक गंभीर कोड गंध है।

+0

मुझे नहीं लगता * यह एक सिंक समस्या है, हालांकि मुझे लगता है कि मैं इस समय इसकी गारंटी नहीं दे सकता। जिस स्थिति में यह विफल रहता है, मैं प्रोजेक्ट को छूए बिना 'रन -> क्रैश -> रन -> (सफलतापूर्वक खुलता हूं)' दबाता हूं। इसके अलावा मैंने हाल ही में अपने किसी भी संसाधन को नहीं बदला है, और आम तौर पर जब मैं संसाधनों को सक्रिय रूप से बदल रहा हूं तो मुझे केवल सिंक समस्या से बाहर दिखाई देता है। अगली बार ऐसा होता है कि मैं सुनिश्चित करने के लिए डिवाइस से उसी एपीके को फिर से चालू करने का प्रयास करूंगा। – Tim

1

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

संबंधित मुद्दे