2012-09-24 10 views
13

मैं किसी को यहाँ उम्मीद कर रही थी एक विचार क्या व्यवहार की इस तरह का कारण बनता है हो सकता है:गुम या गलत चित्र और पृष्ठभूमि बेतरतीब ढंग से एप्लिकेशन जीवनचक्र में

अपने आवेदन के दौरान मालूम होता है यादृच्छिक स्थानों में और यादृच्छिक की स्थिति में मैं यह देखने रहा हूँ अजीब यूआई मुद्दा। छवियों को काला (सही सीमाओं के साथ) या गलत छवि स्रोत (फिर से, सही सीमाओं के साथ) लोड किया जा रहा है। यह ImageViews पर प्रभाव डालता है और रंग संसाधनों के संदर्भों के साथ android:background टैग प्रभावित करता है।

मेरा आवेदन 6 लाइब्रेरी प्रोजेक्ट पर निर्भर करता है, यह ऐप में एक सेवा और क्रियाकलापों के माध्यम से मूल कोड चलाता है GlSurfaceViews (हालांकि, समस्या को प्रदर्शित करने वाली सभी गतिविधियां ओपनजीएल घटक नहीं हैं)। बड़ी मात्रा में स्मृति का उपयोग करके मुझे लगता है कि समस्या इनमें से किसी भी स्थान या उनमें से एक संयोजन से हो सकती है।

आप निम्न स्क्रीन शॉट्स में इस व्यवहार को देख सकते हैं:

  • यह वास्तव में एक 6 या तो पिक्सेल चौड़ा स्तंभ विभाजक छवि है जो गलती से मेरी imageView में तैयार किया गया है (imageView सही ढंग से आकार है लगता है अपने आप)।

    Torn

  • जब आवेदन से बाहर जा रहा है और उसके बाद फिर से (बार-बार) में इसे वापस बजाय दिखाई दिया (और बने रहे) तो जैसे:

    Black

  • एक सेना स्पष्ट और एक के बाद साफ़ ऐप डेटा यह सही प्रारूप में लौटा:

    This is the original:

जैसा कि आप इसके आगे बढ़ते हुए ग्लास छवि को भी देख सकते हैं, इनमें से प्रत्येक में ठीक दिख रहा है। इन अनुपलब्ध/गलत छवियों और पृष्ठभूमि के साथ समस्याएं एप्लिकेशन एप्लिकेशन लाइफसाइक्ल में यादृच्छिक रूप से होती हैं, और मैं इसे पुन: उत्पन्न करने का कोई तरीका नहीं ढूंढ पा रहा हूं।

इन छवियों के लिए लेआउट कुछ खास नहीं हैं, मैं प्रतिपादन जीवन चक्र के दौरान कुछ भी मजाकिया नहीं कर रहा हूं (मैं onDraw() या onMeasure() या इसी तरह से ओवरराइड नहीं कर रहा हूं)। इन छवियों का स्रोत गतिशील रूप से सेट नहीं किया जा रहा है लेकिन एक्सएमएल के माध्यम से।

जैसा कि आप उपर्युक्त उदाहरण से देख सकते हैं, यह एक बिल्ड समस्या नहीं है क्योंकि यह ऐप लाइफसाइकिलों के बीच नहीं होता है, जो कि इंस्टॉल के बीच नहीं है। यह भी सैमसंग 8.9, एसर Iconia Tab, Motarola XOOM,

मुझे ऐसा लगता है संदर्भ तालिका के साथ त्रुटि किसी प्रकार का हो सकता है, हो सकता है यह शायद मेरी मूल कोड से धकेल दिया था किया गया है विभिन्न उपकरणों पर हो रहा है,? या यह बहुत अधिक स्मृति का उपयोग कर आवेदन के कुछ चरणों में मेरा प्रभाव है?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/browseProgressWrapper" 
       android:layout_width="match_parent" 
       android:layout_height="@dimen/actionbar_compat_height" 
       android:orientation="horizontal"> 
    <RelativeLayout android:layout_width="@dimen/search_bar_width" 
        android:layout_height="match_parent">  
     <EditText  android:id="@+id/browseFilter" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         android:layout_marginTop="4dp" 
         android:layout_marginLeft="5dp"   
         android:imeOptions="actionSearch" 
         android:background="@drawable/edit_text_blue" 
         android:maxLength="30"/> 
     <ImageView  android:id="@+id/clearSearch" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_alignParentRight="true" 
         android:layout_centerVertical="true" 
         android:src="@drawable/ic_input_delete" 
         android:layout_marginRight="5dp"/> 
    </RelativeLayout>     
    <ImageView  android:id="@+id/browseFilterButton" 
        android:src="@drawable/ic_menu_search" 
        android:scaleType="center" 
        android:layout_width="@dimen/actionbar_compat_height" 
        android:layout_height="@dimen/actionbar_compat_height" 
        android:layout_gravity="center_vertical" 
        android:minWidth="@dimen/actionbar_compat_height"/>   
</LinearLayout> 

एक और ऐसे घटना आसपास के कोड/लेआउट का एक और अधिक पूर्ण विवरण मैं स्क्रीनशॉट के लिए प्राप्त करने के लिए हुआ:

मैं एक है

यहाँ ऊपर के उदाहरण के लिए XML स्रोत है "सेटिंग्स" Activity जो नई सेटिंग्स के विवरण सहेजने के बाद मेरे ऐप को पुनरारंभ करता है।

mConfiguration.save(); 
    mConfiguration = new Configuration(Configuration.getInstance()); 
    getActivity().stopService(new Intent(getActivity(), NativeService.class)); 
    getActivity().finish(); 
    startActivity(new Intent(getActivity(), SplashActivity.class)); 

समय (और सबसे उपकरणों पर) इस ठीक काम करता है से अधिकांश, स्पलैश गतिविधि एक छवि है जो लोड करता है शामिल हैं: यह एक Service रोक, एक नया Activity (स्पलैश गतिविधि) को कॉल करने और खुद को खत्म कर करके करता है सही ढंग से। कभी-कभी कुछ उपकरणों पर स्पलैश गतिविधि या तो गलत संसाधन लोड करती है (मेरे परीक्षकों को "नाइके टिक के ऊपर उल्टा" के रूप में संदर्भित किया जाता है) या बस एक खाली बॉक्स (जैसा कि नीचे देखा गया है)। क्या किसी को पता है क्यों?

enter image description here

यहाँ, स्पलैश पेज के लिए लेआउट है के रूप में आप देख सकते हैं कि यह बहुत आसान है, कोई आश्चर्य:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/ContentBackgroundColor" 
    android:orientation="vertical" > 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="2" /> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:src="@drawable/manager_android_400" /> 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="1" /> 

    <ProgressBar 
     style="@android:style/Widget.ProgressBar.Large" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" /> 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="2" /> 

</LinearLayout> 

थ्योरी का परीक्षण किया और debunct:

मैंने सिद्धांत है कि यह एक प्रोसेसर/मेमोरी मुद्दा हो सकता है जहां स्प्लैश स्क्रीन से पहले लेआउट पूरी तरह से तैयार नहीं किया जा रहा है और अगली गतिविधि पर चलता है इसलिए मैंने कोड के इस टुकड़े में डाल दिया:

image = (ImageView) findViewById(R.id.image); 
    image.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      image.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      moveToStartScreen.start(); 
     } 
    }); 

आशा थी कि ऊपर दिया गया कोड यह सुनिश्चित करेगा कि छवि को निश्चित रूप से प्रारंभ पृष्ठ पर जाने से पहले लोड किया गया है लेकिन ऐसा कोई प्रभावशाली प्रभाव नहीं हुआ है।

एक और सिद्धांत

मैं भी अगर यह R.id/R.colour/R.drawable संसाधनों कुछ कैसे प्रोग्राम निष्पादन में currupted किये जाने के कारण किया जा रहा हो सकता है सोच रहा था? क्या किसी को पता है कि कि हो सकता है।

क्या मेरा मूल कोड कुछ स्मृति पते पर प्रचलित हो सकता है जो एंड्रॉइड सही ढंग से आवंटित नहीं कर रहा है?

क्या किसी ने इससे पहले देखा है - या शायद यह पता है कि यह व्यवहार क्यों होता है?

+0

मैं गलत ड्रॉएबल पुस्तकालय परियोजनाओं में दिखाने मैं का उपयोग कर रहा था के साथ मुद्दों किया है, और जब से तुम एक ही बात मैं इसे googled सूचना दी और साथ समाप्त हो गया http://stackoverflow.com/questions/7724145/android-drawable -resource-आईडी-संघर्ष। कोई मदद? – aamit915

+0

क्या आप अपने मूल कोड को अपने ऐप से इंटरफेस करने के तरीके के बारे में कुछ और बता सकते हैं? किसी चीज़ पर लिखे गए मूल कोड मेरे लिए सबसे अधिक व्यावहारिक प्रतीत होता है। –

+0

@ मैट गिब्सन जेएनआई विधियों के माध्यम से देशी कोड इंटरफेस जो कॉलबैक/श्रोता विधियों को आग लगाते हैं जो यूआई घटक प्राप्त करने के लिए पंजीकरण कर सकते हैं। जेएनआई के बाहर भेजने का कोई प्रत्यक्ष डेटा नहीं है जबतक कि आप सीधे ओपनजीएल संदर्भ में मूल कोड लेखन पर विचार नहीं करते हैं। – Graeme

उत्तर

2

ग्रीम, मुझे लगभग एक ही समस्या थी और पता चला कि यह एंड्रॉइड प्लैटफॉर्म की bug की सूचना मिली थी। मुझे लगता है कि 3.0 संस्करण में यह सही किया गया था। आप किस एपीआई के साथ संकलित कर रहे हैं? पिछले उपलब्ध एपीआई के साथ निर्माण और JDK 1.6

साथ संकलित करने के लिए आपकी समस्या को इस बग से संबंधित है, तो इस समस्या को दूर करना चाहिए सुनिश्चित करने के लिए प्रयास करें।

+0

यह निश्चित रूप से बग रिपोर्ट में से एक से अलग प्रस्तुत करता है (गायब छवियां पूरे ऐप में होती हैं और इसलिए "पहली" छवि नहीं होती है, हालांकि मैं आसानी से यह सोच सकता हूं कि यह संसाधन आईडी टकराव है और मैंने हमेशा इसे संदेह किया है एक ओएस बग बनें। – Graeme

+1

मैं पुष्टि कर सकता हूं कि यह बग ओएस के हनीकॉम + संस्करणों पर मौजूद नहीं है और इसलिए मुझे उम्मीद है कि यह डिवाइस कम हो जाएगा क्योंकि अधिक डिवाइस अपग्रेड हो जाते हैं या अप्रचलित हो जाते हैं। – Graeme

0

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

मुझे पता चला है कि यद्यपि .java फ़ाइल निर्भरताओं को पूरे सिस्टम में प्रचारित किया जाता है, यह हमेशा छवियों और .xml फ़ाइलों जैसे संसाधनों के मामले में नहीं होता है।

समाधान काफी सरल, साफ सब कुछ है, अपनी सभी परियोजनाओं को ताज़ा करें, और पुनर्निर्माण करें। विस्तारित या काले किनारों को जाना चाहिए।

नोट: इस समस्या का मुख्य अभिव्यक्ति तब होती है जब 9-पैच छवियों को मानक .png छवियों के समान माना जाता है। इसका मतलब है कि वे केवल किनारों की बजाय छवि में एक रैखिक तरीके से फैले हुए हैं। मेरे लिए, यह आपके 'टूटे/खिंचाव' उदाहरण बताता है। मैंने अक्सर इसी तरह देखा है। एक और आम अभिव्यक्ति यह है कि टेक्स्ट स्ट्रिंग कभी-कभी गलत संसाधनों के साथ प्रदर्शित होती है!

+0

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

+0

आपके उत्तर के लिए धन्यवाद। मेरे पास 10+ रिलीज बिल्डों के महीनों के लिए चलने वाले हफ्तों तक इस मुद्दे का सामना करना पड़ा है और भलाई जानता है कि कितने 100 डीबग बनाता है। – Graeme

+0

इसके अलावा, शामिल छवियां 9-पैच नहीं हैं, उनमें से कुछ छवियां भी नहीं हैं (वे रंग संसाधनों के लिंक हैं)। साथ ही, ऐप पर डेटा साफ़ करना और फिर से समस्या को हल करना मतलब है कि यह एक बिल्ड मुद्दा नहीं हो सकता है। – Graeme

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