10

तो मेरे पास एक ऐप विजेट है जो अच्छी तरह से ताज़ा हो रहा है, ImageView में नियमित रूप से घड़ी की तरह एक नया बिटमैप लोड कर रहा है। फिर, किसी बिंदु पर, और चुपचाप, यह किसी और को अद्यतन करना बंद कर देगा। मैं लॉग से बता सकता हूं, और एक सर्वर पर गतिविधि से जो मेरा कोड पूछताछ कर रहा है, कि विजेट वास्तव में नियमित रूप से आग लग रहा है (onReceive() द्वारा पकड़े गए प्रसारणों के माध्यम से, और इसकी सामग्री को अपेक्षित रूप से कर रहा है। केवल एक चीज जो नहीं है ऐसा हो रहा है कि विजेट सामग्री अद्यतन नहीं हो रही है।एपविजेट फ्रीज और अब अपडेट करने से इंकार कर देता है: अपडेट को अनदेखा करता है AppWidget

तो, विजेट में आग लगने पर कोड को निष्पादित करने में, मैं एक नया रिमोट व्यू बना रहा हूं और इसमें सामान जोड़ रहा हूं, जिसमें remoteViews.setImageViewBitmap(imageViewID, bmp) के माध्यम से एक नया बिटमैप लोड करना शामिल है, और फिर अंत में appWidgetManager.updateAppWidget(appWidgetId, remoteViews) अच्छी तरह से बुला विजेट सामग्री अद्यतन करने के लिए। काम करता है ... जब तक यह काम करना बंद।

मैं, क्या कोड पोस्ट करने के लिए यकीन नहीं है क्योंकि बात समय की ठीक 99% काम करता है, लेकिन कभी-कभी updateAppWidget() बंद हो जाता है काम कर , बिना किसी प्रकट कारण के। ऐसा लगता है कि यह मेरे कोड में एक बग के बजाय एक सिस्टम मुद्दा है, लेकिन मैं गलत हो सकता था।

एकमात्र चीज जो प्रतीत होता है यह संकेत तब होता है जब कनेक्टिविटी में बदलाव होते हैं, उदा। वाईफाई के लिए कोई सिग्नल नहीं जा रहा है, शायद इस तरह के बदलाव। ऐसा लगता है कि उन परिस्थितियों में और अधिक होता है।

और एक बार जब विजेट फ्रीज हो जाता है, तो केवल एक चीज जो इसे अस्वीकार करती है, डिवाइस को पुनरारंभ कर रही है। पुनरारंभ किए बिना, विजेट को हटाने और एक नया जोड़ने से काम नहीं होता है। वास्तव में, एक मृत विजेट में एक नया परिणाम जोड़ना जो कॉन्फ़िगर गतिविधि को खोलने के लिए एक क्लिक का जवाब भी नहीं देता है, संभवतः remoteViews.setOnClickPendingIntent(R.id.widget, configPendingIntent) को RemoteViews में अन्य सभी चीज़ों की तरह अनदेखा किया जाता है, मैं ध्यान से appWidgetManager.updateAppWidget() पर निर्माण और भेजता हूं।

यह रूप में कई अन्य लोगों के यहां से वर्णित काफी हो रहा है:

https://code.google.com/p/android/issues/detail?id=28216

और के रूप में अभी तक वहाँ कोई ज्ञात इलाज हो रहा है। https://code.google.com/p/android/issues/detail?id=28216#c56 पर पोस्ट कुछ वादा पेश करने लग रहा था, लेकिन मैंने विभिन्न स्थानों पर AppWidgetHost.startListening() पर कॉल करने का प्रयास किया है, जिसमें दोहराने वाले अलार्म के माध्यम से नियमित अंतराल शामिल है, यह देखने के लिए कि क्या मैं विजेट को किकस्टार्ट कर सकता हूं, लेकिन कुछ भी काम नहीं करता है।

और अन्य उपयोगकर्ताओं (बल्कि डेवलपर्स से) भी इस मुद्दे को देख रहा हो रहे हैं: http://androidforums.com/threads/clock-widget-keeps-freezing-please-help.530333/

कोई भी विचार? यह धीरे-धीरे मुझे पागल कर रहा है!

+0

मुझे समाधान भी नहीं मिला है, लेकिन मुझे एक कामकाज मिला है (हालांकि एक अच्छा नहीं)। मैंने पाया कि एक बार मैंने अपनी होम स्क्रीन से कई अन्य समान विजेट हटा दिए जाने पर समस्या दूर हो गई है। मेरा विजेट Play Store पर दूसरों के समान है, इसलिए मेरे होम स्क्रीन पर भी मेरी प्रतियोगिता से कुछ विजेट्स थे। चूंकि मैंने उन्हें हटा दिया है, इसलिए मैं बिना किसी ग्लिच के अपडेट कर रहा हूं। मैंने जितना संभव हो उतना मेमोरी मुक्त करने की कोशिश की, ऐप कैश साफ़ कर दिया, और लॉककैट (डायल * # 9900 # फोन में, फिर "डंपस्टेट/लॉगकैट हटाएं" बटन दबाएं)। तब से ठीक रहा है। – drmrbrewer

उत्तर

5
remoteViews.setImageViewBitmap(imageViewID, bmp) 

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

इसके बजाय आपको चाहिए setImageViewUrihttps://developer.android.com/reference/android/widget/RemoteViews.html#setImageViewUri(int,%20android.net.Uri) का उपयोग करें।यह थोड़ा और काम है क्योंकि आपको बिटमैप को सहेजने की आवश्यकता है और फिर लॉन्चर को इसके लिए एक यूरी भेजना है, हालांकि वर्तमान में सभी या लगभग सभी लॉन्चर में READ_EXTERNAL_STORAGE है, इसलिए file:/// यूरी बाहरी स्टोरेज में काम कर सकता है, आपको भविष्य में उस पर भरोसा नहीं करना चाहिए और इसके बजाय FileProviderhttps://developer.android.com/reference/android/support/v4/content/FileProvider.html

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